weaver-e10-builder 1.6.10 → 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 (155) hide show
  1. package/dist/commands/report-admin.d.ts.map +1 -1
  2. package/dist/commands/report-admin.js +378 -2
  3. package/dist/commands/report-admin.js.map +1 -1
  4. package/dist/commands/report-validate.d.ts.map +1 -1
  5. package/dist/commands/report-validate.js +1066 -3
  6. package/dist/commands/report-validate.js.map +1 -1
  7. package/dist/commands/report.d.ts.map +1 -1
  8. package/dist/commands/report.js +341 -3
  9. package/dist/commands/report.js.map +1 -1
  10. package/dist/commands/workflow-after-submit-comment.d.ts +3 -0
  11. package/dist/commands/workflow-after-submit-comment.d.ts.map +1 -0
  12. package/dist/commands/workflow-after-submit-comment.js +56 -0
  13. package/dist/commands/workflow-after-submit-comment.js.map +1 -0
  14. package/dist/commands/workflow-setting.d.ts.map +1 -1
  15. package/dist/commands/workflow-setting.js +2 -67
  16. package/dist/commands/workflow-setting.js.map +1 -1
  17. package/dist/services/report/blueprint.d.ts +109 -0
  18. package/dist/services/report/blueprint.d.ts.map +1 -0
  19. package/dist/services/report/blueprint.js +322 -0
  20. package/dist/services/report/blueprint.js.map +1 -0
  21. package/dist/services/report/build.d.ts.map +1 -1
  22. package/dist/services/report/build.js +8 -3
  23. package/dist/services/report/build.js.map +1 -1
  24. package/dist/services/report/card.d.ts +65 -0
  25. package/dist/services/report/card.d.ts.map +1 -0
  26. package/dist/services/report/card.js +151 -0
  27. package/dist/services/report/card.js.map +1 -0
  28. package/dist/services/report/copy-health.d.ts +31 -0
  29. package/dist/services/report/copy-health.d.ts.map +1 -0
  30. package/dist/services/report/copy-health.js +87 -0
  31. package/dist/services/report/copy-health.js.map +1 -0
  32. package/dist/services/report/dataset-heal.d.ts +64 -0
  33. package/dist/services/report/dataset-heal.d.ts.map +1 -0
  34. package/dist/services/report/dataset-heal.js +89 -0
  35. package/dist/services/report/dataset-heal.js.map +1 -0
  36. package/dist/services/report/dataset-ids.d.ts +70 -0
  37. package/dist/services/report/dataset-ids.d.ts.map +1 -0
  38. package/dist/services/report/dataset-ids.js +149 -0
  39. package/dist/services/report/dataset-ids.js.map +1 -0
  40. package/dist/services/report/dataset.d.ts.map +1 -1
  41. package/dist/services/report/dataset.js +3 -1
  42. package/dist/services/report/dataset.js.map +1 -1
  43. package/dist/services/report/empty-dataset.d.ts +51 -0
  44. package/dist/services/report/empty-dataset.d.ts.map +1 -0
  45. package/dist/services/report/empty-dataset.js +213 -0
  46. package/dist/services/report/empty-dataset.js.map +1 -0
  47. package/dist/services/report/field-binding.d.ts +75 -0
  48. package/dist/services/report/field-binding.d.ts.map +1 -0
  49. package/dist/services/report/field-binding.js +160 -0
  50. package/dist/services/report/field-binding.js.map +1 -0
  51. package/dist/services/report/forms.d.ts +32 -0
  52. package/dist/services/report/forms.d.ts.map +1 -1
  53. package/dist/services/report/forms.js +90 -0
  54. package/dist/services/report/forms.js.map +1 -1
  55. package/dist/services/report/formula-parent.d.ts +25 -0
  56. package/dist/services/report/formula-parent.d.ts.map +1 -0
  57. package/dist/services/report/formula-parent.js +116 -0
  58. package/dist/services/report/formula-parent.js.map +1 -0
  59. package/dist/services/report/locate.d.ts +40 -0
  60. package/dist/services/report/locate.d.ts.map +1 -0
  61. package/dist/services/report/locate.js +122 -0
  62. package/dist/services/report/locate.js.map +1 -0
  63. package/dist/services/report/reports.d.ts +4 -0
  64. package/dist/services/report/reports.d.ts.map +1 -1
  65. package/dist/services/report/reports.js +4 -2
  66. package/dist/services/report/reports.js.map +1 -1
  67. package/dist/services/report/scene.d.ts +22 -0
  68. package/dist/services/report/scene.d.ts.map +1 -0
  69. package/dist/services/report/scene.js +145 -0
  70. package/dist/services/report/scene.js.map +1 -0
  71. package/dist/services/report/types.d.ts +28 -0
  72. package/dist/services/report/types.d.ts.map +1 -1
  73. package/dist/services/report/verify.d.ts +24 -0
  74. package/dist/services/report/verify.d.ts.map +1 -1
  75. package/dist/services/report/verify.js +115 -2
  76. package/dist/services/report/verify.js.map +1 -1
  77. package/dist/services/report/workbook.d.ts +12 -1
  78. package/dist/services/report/workbook.d.ts.map +1 -1
  79. package/dist/services/report/workbook.js +107 -8
  80. package/dist/services/report/workbook.js.map +1 -1
  81. package/dist/services/workflow-after-submit-comment.d.ts +20 -0
  82. package/dist/services/workflow-after-submit-comment.d.ts.map +1 -0
  83. package/dist/services/workflow-after-submit-comment.js +81 -0
  84. package/dist/services/workflow-after-submit-comment.js.map +1 -0
  85. package/ecodecmd/src/build.js +36 -12
  86. package/package.json +1 -1
  87. package/skill-docs/SKILL.md +4 -4
  88. package/skill-docs/_catalog.md +10 -1
  89. package/skill-docs/references/coding/guide-page-code.md +95 -0
  90. package/skill-docs/references/components/ref-component-common.md +98 -0
  91. package/skill-docs/references/report/add-dataset-registration-guide.md +44 -22
  92. package/skill-docs/references/report/advanced-crosstab-tree-guide.md +82 -0
  93. package/skill-docs/references/report/ai-report-workflow.md +100 -100
  94. package/skill-docs/references/report/api-auth-headers.md +129 -0
  95. package/skill-docs/references/report/api-report-build-fast-path.md +274 -275
  96. package/skill-docs/references/report/app-datasource-lookup-guide.md +230 -230
  97. package/skill-docs/references/report/branch-scene-guide.md +293 -0
  98. package/skill-docs/references/report/build-resilience-guide.md +99 -0
  99. package/skill-docs/references/report/card-report-guide.md +110 -0
  100. package/skill-docs/references/report/cell-config-echo-guide.md +44 -9
  101. package/skill-docs/references/report/cell-transform-guide.md +9 -9
  102. package/skill-docs/references/report/column-split-report-guide.md +96 -0
  103. package/skill-docs/references/report/condition-format-guide.md +49 -24
  104. package/skill-docs/references/report/cross-dataset-filter-guide.md +180 -69
  105. package/skill-docs/references/report/crosstab-raw-workbook-guide.md +265 -0
  106. package/skill-docs/references/report/dataset-query-filter-guide.md +231 -235
  107. package/skill-docs/references/report/dataset-sidebar-ops-guide.md +75 -34
  108. package/skill-docs/references/report/dataset-table-field-contract-guide.md +196 -46
  109. package/skill-docs/references/report/datasource-metadata-guide.md +128 -119
  110. package/skill-docs/references/report/datasource-selection-and-parent-filter-guide.md +183 -148
  111. package/skill-docs/references/report/date-range-query-reference.md +97 -102
  112. package/skill-docs/references/report/default-header-style-guide.md +8 -8
  113. package/skill-docs/references/report/designer-blank-prevention-guide.md +8 -8
  114. package/skill-docs/references/report/dossier-report-guide.md +69 -0
  115. package/skill-docs/references/report/drilldown-report-guide.md +59 -0
  116. package/skill-docs/references/report/event-hreflink-guide.md +53 -47
  117. package/skill-docs/references/report/expansion-block-parent-config-guide.md +208 -0
  118. package/skill-docs/references/report/failure-cleanup-and-nonblocking-guide.md +183 -0
  119. package/skill-docs/references/report/field-bind-exact-match-guide.md +208 -208
  120. package/skill-docs/references/report/financial-stats-report-guide.md +89 -0
  121. package/skill-docs/references/report/formula-cell-api-guide.md +325 -258
  122. package/skill-docs/references/report/golden-case-summary-sheet.md +200 -0
  123. package/skill-docs/references/report/guide-report-build.md +6 -1
  124. package/skill-docs/references/report/hidden-row-and-header-merge-guide.md +10 -10
  125. package/skill-docs/references/report/layout-showlocation-freeze-guide.md +39 -10
  126. package/skill-docs/references/report/multi-report-crosstab-casebook.md +263 -0
  127. package/skill-docs/references/report/paged-group-report-guide.md +68 -0
  128. package/skill-docs/references/report/preaggregate-auto-disable-guide.md +24 -13
  129. package/skill-docs/references/report/query-condition-api-guide.md +145 -125
  130. package/skill-docs/references/report/ref-report-commands.md +41 -3
  131. package/skill-docs/references/report/report-baseinfo-defaults-guide.md +117 -117
  132. package/skill-docs/references/report/report-building-guide.md +52 -52
  133. package/skill-docs/references/report/report-case-prompts.md +104 -0
  134. package/skill-docs/references/report/report-config-schema.md +281 -281
  135. package/skill-docs/references/report/report-create-modes-guide.md +73 -35
  136. package/skill-docs/references/report/report-data-model.md +131 -131
  137. package/skill-docs/references/report/report-delivery-contract.md +23 -3
  138. package/skill-docs/references/report/report-designer-feature-map.md +30 -35
  139. package/skill-docs/references/report/report-help-guide.md +304 -0
  140. package/skill-docs/references/report/report-internal-error-guide.md +71 -0
  141. package/skill-docs/references/report/report-knowledge-base.md +27 -27
  142. package/skill-docs/references/report/report-lifecycle-api-guide.md +126 -94
  143. package/skill-docs/references/report/report-list-page-ops-guide.md +54 -8
  144. package/skill-docs/references/report/report-permission-guide.md +99 -102
  145. package/skill-docs/references/report/report-requirement-analysis-template.md +93 -29
  146. package/skill-docs/references/report/report-self-check-guide.md +164 -164
  147. package/skill-docs/references/report/report-verification-discipline-guide.md +203 -0
  148. package/skill-docs/references/report/safe-partial-save-guide.md +151 -151
  149. package/skill-docs/references/report/shard-freeze-report-guide.md +97 -0
  150. package/skill-docs/references/report/snowflake-id-precision-guide.md +84 -84
  151. package/skill-docs/references/report/spec-build-schema.md +71 -71
  152. package/skill-docs/references/report/targeted-fix-guide.md +155 -97
  153. package/skill-docs/references/report/user-request-scope-only-guide.md +23 -4
  154. package/skill-docs/references/workflow/guide-after-submit-comment.md +58 -0
  155. package/skill-docs/references/workflow/guide-workflow.md +6 -0
@@ -1,7 +1,7 @@
1
1
  # 报表设计器 · 功能全景与 API 对照
2
2
 
3
3
  > **页面**:`https://{host}/sp/edc/report/designer/{reportId}`
4
- > **示例**:`https://weapp.yunteams.cn/sp/edc/report/designer/1310535032076214273`
4
+ > **示例**:`https://<平台地址>/sp/edc/report/designer/<reportId>`
5
5
  > **源码**:`EdcReportDevDesignController.java`、`EdcReportDevBaseController.java`(weaver-edcreportd)
6
6
  > **UI 说明**:`report-help-guide.md`、`report-building-guide.md`
7
7
  > **鉴权**:`api-auth-headers.md`(Cookie.raw + eteamsid + User-Agent)
@@ -10,7 +10,7 @@
10
10
 
11
11
  ## 一、设计器进入时加载链
12
12
 
13
- > **Live **(2026-09-04 · 报表 `1310535032076214273` · 浏览器自动化实际请求 + e10-login)见 §十一。
13
+ > **Live 验证**(2026-09-04 · 报表 `1310535032076214273` · 浏览器自动化接口返回 + e10-cli auth)见 §十一。
14
14
 
15
15
  | 顺序 | 接口 | 说明 |
16
16
  |------|------|------|
@@ -33,18 +33,18 @@
33
33
 
34
34
  ```mermaid
35
35
  flowchart TB
36
- subgraph top["顶部 Ribbon + 右上角"]
37
- T1[开始]
38
- T2[页面]
39
- T3[公式]
40
- TR[保存 / 预览 / 历史版本]
41
- end
42
- subgraph body["主体"]
43
- L[左侧 · 数据集面板]
44
- C[中间 · SpreadJS 画布]
45
- R[右侧 · 单元格/事件/样式]
46
- end
47
- top --> body
36
+ subgraph top["顶部 Ribbon + 右上角"]
37
+ T1[开始]
38
+ T2[页面]
39
+ T3[公式]
40
+ TR[保存 / 预览 / 历史版本]
41
+ end
42
+ subgraph body["主体"]
43
+ L[左侧 · 数据集面板]
44
+ C[中间 · SpreadJS 画布]
45
+ R[右侧 · 单元格/事件/样式]
46
+ end
47
+ top --> body
48
48
  ```
49
49
 
50
50
  | 区域 | 作用 | 核心配置落点 |
@@ -117,7 +117,7 @@ flowchart TB
117
117
 
118
118
  | 功能 | UI 路径 | API | 说明 |
119
119
  |------|---------|-----|------|
120
- | **查询设置** | 页面 → 查询设置 | `GET getQueryConfig?sheetId={reportId}` | Live 打开面板即 GET |
120
+ | **查询设置** | 页面 → 查询设置 | `GET getQueryConfig?sheetId={reportId}` | Live 验证:打开面板即 GET |
121
121
  | **更新查询类型** | 查询设置内 | `POST updateQueryType` | `queryType`: **`["advance"]` / `["filter"]`(JSON 数组)** ⚠️ 会批量覆盖所有条件的 `queryType` |
122
122
  | **+ 添加查询条件** | 页面 → + 添加 | `POST saveQueryItem` | 条件字段 JSON 数组 |
123
123
  | **删除条件** | 条件列表 | `POST delQueryItem` | 按 id |
@@ -190,7 +190,7 @@ flowchart TB
190
190
  #### 4.6.1 网格线 / 行号 / 列头 — 默认关闭(强制 · 防 500)
191
191
 
192
192
  > **平台常规默认关闭**。Agent **不得**在用户未明确要求时自行开启。
193
- > ** 固化**:`saveReportDevInfo` 曾 500「报表内部错误」,二分定位为 workbook sheet **多写了 `gridline` 字段(存在即 500)**,去掉即恢复。
193
+ > **验证固化**:`saveReportDevInfo` 曾 500「报表内部错误」,二分定位为 workbook sheet **多写了 `gridline` 字段(存在即 500)**,去掉即恢复。
194
194
  > 落库前须 `e10-cli report validate gridline`(`validate blank` / `safe_report_save` 已联动剔除)。
195
195
 
196
196
  | 能力 | 关闭(默认 · 必须保持) | 开启(仅当会话明确要求) |
@@ -234,8 +234,8 @@ flowchart TB
234
234
  | 功能 | UI 路径 | API / 脚本 | 说明 |
235
235
  |------|---------|--------------|------|
236
236
  | 快照生成策略 | 页面 → 快照设置 | `saveReportDevInfo` + `workbook.snapshot` | cron 透传 escheduler;`functionName=createSnapshot` |
237
- | 定时快照脚本 | — | `e10-cli report snapshot set` / `e10-cli report snapshot set` | **必须**经 `safe_report_save.js`;默认名 **`{报表名}-{date}-{time}`**;`sheetId=String(reportId)` 禁 Number |
238
- | 空白门禁 | — | `validate_designer_blank_guard.js` / `verify blank` | 见 `designer-blank-prevention-guide.md` |
237
+ | 定时快照脚本 | — | `e10-cli report snapshot` / `e10-cli report snapshot set` | **必须**经 ``;默认名 **`{报表名}-{date}-{time}`**;`sheetId=String(reportId)` 禁 Number |
238
+ | 空白门禁 | — | `e10-cli report validate blank` / `verify blank` | 见 `designer-blank-prevention-guide.md` |
239
239
  | 查看快照列表 | 运行态 | `POST getSnapshotDatas` | |
240
240
  | 还原版本(layout 事故) | 版本管理 | `GET rollbackReport` | 优先于空 workbook 重保存 |
241
241
 
@@ -322,7 +322,7 @@ flowchart TB
322
322
  | 显示方式 | 分组 / 排列 / 汇总 / 树形 | 汇总含求和/计数/平均等 |
323
323
  | 日期分组 | 年 / 年月 / 不设置 | — |
324
324
  | 分组排序 | 升序 / 降序 / 不排序 | — |
325
- | **筛选** | 父格筛选 / 自定义筛选 / 结果筛选 | `cross-dataset-filter-guide.md` · CLI `report cell-filter set\|remove` |
325
+ | **筛选** | 父格筛选 / 自定义筛选 / 结果筛选 | `cross-dataset-filter-guide.md` |
326
326
  | **字段转换** | 人员/部门/部门全路径/checkbox/选择框/颜色/分值图标/斜线/关联/图片 | **`cell-transform-guide.md`** · `transType`+`browserType` |
327
327
  | **HTML转换** | 是/否 | `isHtml` `"1"|"0"` |
328
328
  | **前缀/后缀** | 文本 | `prefixAndSuffix:["前","后"]` |
@@ -332,7 +332,7 @@ flowchart TB
332
332
 
333
333
  ### 7.2 「事件」Tab
334
334
 
335
- > **完整**:`event-hreflink-guide.md` · 写入 CLI `report cell-event set|clear` · 写法校验 `validate href`
335
+ > **完整**:`event-hreflink-guide.md` · CLI `validate href`
336
336
 
337
337
  | 属性 | 落库 | 说明 |
338
338
  |------|------|------|
@@ -385,8 +385,6 @@ flowchart TB
385
385
 
386
386
  示例:`供应商采购进货明细表-2026-09-04-14-09-30`
387
387
 
388
- 脚本:`本地工作目录`(禁止自造 `V20260904…` 这类 UTC 压缩名)。
389
-
390
388
  **版本列表**(POST form):
391
389
 
392
390
  ```
@@ -430,15 +428,13 @@ pageNo=1&pageSize=10&dateRange=["",""]&sheetId=<reportId>&versionName=&creators=
430
428
 
431
429
  ---
432
430
 
433
- ## 十一、yunteams Live 实际请求(2026-09-04)
431
+ ## 十一、官方 SaaS 环境 Live 接口返回(2026-09-04)
434
432
 
435
433
  | 项 | 值 |
436
434
  |----|-----|
437
- | 设计器 URL | `https://weapp.yunteams.cn/sp/edc/report/designer/1310535032076214273` |
435
+ | 设计器 URL | `https://<平台地址>/sp/edc/report/designer/<reportId>` |
438
436
  | 报表 | 销售经营分析报表 |
439
437
  | appId | `1310076187728674816` |
440
- | 实际请求脚本 | `本地工作目录` |
441
- | 原始 JSON | `本地工作目录` |
442
438
 
443
439
  ### 11.1 进入设计器(页面 load,12 条 report/dataset API)
444
440
 
@@ -455,12 +451,12 @@ pageNo=1&pageSize=10&dateRange=["",""]&sheetId=<reportId>&versionName=&creators=
455
451
 
456
452
  ```json
457
453
  {
458
- "permissionId": "report_view",
459
- "permissionType": 16,
460
- "id": "1310535032076214273",
461
- "sourceId": "1310535032076214273",
462
- "pageSize": 10000,
463
- "current": 1
454
+ "permissionId": "report_view",
455
+ "permissionType": 16,
456
+ "id": "1310535032076214273",
457
+ "sourceId": "1310535032076214273",
458
+ "pageSize": 10000,
459
+ "current": 1
464
460
  }
465
461
  ```
466
462
 
@@ -488,13 +484,12 @@ pageNo=1&pageSize=10&dateRange=["",""]&sheetId=<reportId>&versionName=&creators=
488
484
  | `designKey` | 设计器会话 UUID |
489
485
  | `pageSetting` | JSON 数组,含 `split`(分页/分栏)、`scrollPage` 等 |
490
486
 
491
- ### 11.4 对照实际请求
487
+ ### 11.4 复现接口返回
492
488
 
493
489
  ```bash
494
- cd 本地工作目录
495
490
  npm install
496
491
  node capture_designer_ribbon_live.js
497
492
  # 可选环境变量:REPORT_ID / APP_ID
498
493
  ```
499
494
 
500
- 鉴权:自动读 `e10-login status` 的 ETEAMSID;失效时脚本尝试 passport 表单登录。
495
+ 鉴权:自动读 `e10-cli auth status` 的 ETEAMSID;失效时脚本尝试 passport 表单登录。
@@ -0,0 +1,304 @@
1
+ # E-Builder 报表功能帮助指南(精简版)
2
+
3
+ > **冷启动禁止通读**:见 `api-report-build-fast-path.md`。仅帮助手册问答时按需打开。
4
+ > 本文档基于 e-builder 报表功能帮助文档整理,保留核心功能说明和配置要点。
5
+
6
+ ## 一、功能概述
7
+
8
+ e-Builder 可视化报表功能帮助用户完成各种常见汇总报表的设计、展现和导出。基于浏览器所见即所得地快速完成报表制作,无需安装插件。
9
+
10
+ 核心能力:
11
+ - 拖拽绑定字段方式制作分组汇总表或交叉表
12
+ - 支持 Excel 运算公式
13
+ - 支持多数据集关联
14
+ - 支持条件格式、查询条件、填报字段
15
+ - 支持主题样式、打印设置、分页设置
16
+
17
+ ## 二、报表设计器布局
18
+
19
+ 三栏布局:
20
+ - **左侧**:数据集添加展示区,支持添加多个数据集
21
+ - **中间**:设计展示区(SpreadJS 电子表格引擎)
22
+ - **右侧**:单元格基本信息设置区
23
+
24
+ ## 三、数据集管理
25
+
26
+ ### 3.1 数据集类型
27
+
28
+ | 类型 | 说明 |
29
+ |------|------|
30
+ | e-builder | e-builder 表单数据 |
31
+ | 数据加工 | SQL 视图等加工数据 |
32
+ | 外部数据源 | 外部数据库数据 |
33
+ | 业务模块 | 系统业务模块数据 |
34
+ | 数据集 | 已有数据集 |
35
+
36
+ ### 3.2 数据集核心功能
37
+
38
+ - 数据获取与整合:连接多种数据源
39
+ - 数据处理与转换:去重、汇总计算
40
+ - 数据聚合和分组:分组聚合统计
41
+ - 数据安全控制:基于人员的数据访问权限
42
+ - 性能优化:数据缓存、查询优化
43
+
44
+ ### 3.3 数据集操作
45
+
46
+ - **添加**:左上角"+"按钮,支持多选
47
+ - **预览**:查看数据(展示10条)
48
+ - **筛选**:支持 or/and 组合筛选
49
+ - **聚合**:提前分组汇总
50
+ - **排序**:多字段排序,前面的优先级高
51
+ - **替换**:快速替换数据集和字段
52
+ - **删除**:需先移除报表中引用的字段
53
+
54
+ ## 四、单元格设置
55
+
56
+ ### 4.0 事件 Tab(PC/H5 链接与传参)
57
+
58
+ > **完整规则**:`event-hreflink-guide.md`(帮助手册 §传参 + 源码占位符)。
59
+
60
+ | 配置项 | 说明 |
61
+ |--------|------|
62
+ | PC链接地址 | 落库 `pcHreflink` |
63
+ | H5链接地址 | 落库 `h5Hreflink`(移动端优先) |
64
+ | 打开方式 | **弹出页**=`blank`(默认)· **当前页**=`self` · **执行js代码**=`jsscript` |
65
+
66
+ **传单元格值**(手册):支持当前格值、父格值、父格的父格;链接中写 `{L4}` / `{A1}`,或如 `/sp/ebdfpage/list/xxx?ry=B5&kssj=E3`。
67
+ **传查询条件值**:写 `{searchfield001}`(与条件 `asNameIndex` 对应);区间可用 `_start`/`_end`。
68
+ **超链接文本格**:左父格须指向提供 `{坐标}` 的数据格(见自检指南)。
69
+
70
+ CLI:`e10-cli report validate href --map "弹出页"` / `--file cell.json`
71
+
72
+ ### 4.1 单元格类型
73
+
74
+ | 类型 | 说明 |
75
+ |------|------|
76
+ | 文本字段 | 自定义文本内容 |
77
+ | 数据字段 | 数据集选取的字段 |
78
+ | 公式字段 | 公式计算 |
79
+ | 序号字段 | 自动生成序号 |
80
+ | 全选字段 | 全选框字段 |
81
+ | 数据更新时间字段 | ETL 数据更新时间 |
82
+ | 控件字段 | 多级填报字段 |
83
+
84
+ ### 4.2 扩展方向
85
+
86
+ - **纵向扩展**:从上至下,不同单元格展示
87
+ - **横向扩展**:从左至右,不同单元格展示
88
+ - **不扩展**:所有数据在一个单元格
89
+
90
+ ### 4.3 显示方式
91
+
92
+ - **分组**:相同数据合并为一组
93
+ - **排列**:逐条排列展示
94
+ - **汇总**:求和/最大值/最小值/平均数/个数/去重个数
95
+ - **树形**:上下级层级展示
96
+
97
+ ### 4.4 父格设置
98
+
99
+ - **左父格**:纵向扩展时,其他单元格以此单元格为基准纵向扩展
100
+ - **上父格**:横向扩展时,其他单元格以此单元格为基准横向扩展
101
+ - 左父格和上父格一起设置则交叉扩展
102
+
103
+ 注意事项:
104
+ 1. 父格设置不当会导致数据错乱或重复
105
+ 2. 复杂的父子关系可能影响报表性能
106
+ 3. 注意父子格扩展方向的协调一致
107
+
108
+ ### 4.5 分组方式
109
+
110
+ 日期字段分组方式:年份、年月、月份、年月日
111
+
112
+ ### 4.6 字段格式
113
+
114
+ 支持格式:常规、数值、货币、会计专用、短日期、长日期、时间、百分比、分数、科学计数法、文本
115
+
116
+ > 注意:数值类型字段未设置格式时默认为"常规",导出 excel 会被识别为文本导致公式计算为 0。参与计算的单元格需设置为数值格式。
117
+
118
+ ## 五、字段转换
119
+
120
+ | 转换类型 | 说明 |
121
+ |----------|------|
122
+ | 人员 | 显示人员卡片,可点击查看 |
123
+ | 部门 | 超链接形式,可点击查看部门详情 |
124
+ | Checkbox | 转换为选择框,默认全选 |
125
+ | 选择框 | id 值映射显示名称 |
126
+ | 颜色选择框 | 选项值映射颜色 |
127
+ | 分值图标 | 五星数据展示 |
128
+ | 斜线文字 | 多维交叉表头(最多3个文本) |
129
+ | 关联类型 | 人力/项目/任务/文档/流程/日程/表单/CRM/报告/绩效 |
130
+ | 图片 | 附件/图片字段转换(仅 eb 表单) |
131
+ | HTML | 富文本/标签值 HTML 转换 |
132
+ | 前后缀 | 字段值前后拼接 |
133
+ | 条码/二维码 | 数值字段转换为条码/二维码 |
134
+
135
+ ## 六、筛选设置
136
+
137
+ ### 6.1 父格筛选
138
+
139
+ 当单元格字段与其父格字段不属于同一数据集时,通过父格筛选关联数据集。
140
+
141
+ - **左父格筛选**:当前单元格数据集与左父格数据集的筛选关系
142
+ - **上父格筛选**:当前单元格数据集与上父格数据集的筛选关系
143
+ - **从属关系(subordination)**:与左父格筛选配套,VLOOKUP 式字段映射
144
+ - **字段引用格式**:fieldKey = `{dataSetId}.{sourceId}.{fieldName}`;`id` 必须等于 `currentField`
145
+
146
+ 详见 `cross-dataset-filter-guide.md`。
147
+
148
+ ### 6.2 自定义筛选
149
+
150
+ 当前单元格数据集的自定义筛选条件,支持多个 and/or 组合。配置时 `currentField`/`id` 用 fieldKey,type 用平台枚举。
151
+
152
+ ### 6.3 结果筛选
153
+
154
+ - 前多少个 / 后多少个
155
+ - 奇数 / 偶数
156
+ - 特定:指定条数索引,如 "1,3" 或 "3-16,"
157
+
158
+ ## 七、条件格式
159
+
160
+ ### 7.1 突出显示
161
+
162
+ 支持条件:大于、小于、等于、介于、文本包含、发生日期、重复值
163
+
164
+ 可设置:字体、字号、字形、背景色、字体颜色
165
+
166
+ ### 7.2 数据条
167
+
168
+ 渐变填充 / 实心填充,最大值填满单元格
169
+
170
+ ### 7.3 图标集
171
+
172
+ 4类图标:方向、形状、标记、等级
173
+
174
+ ### 7.4 清除规则
175
+
176
+ 可清除所选单元格规则或整个工作表规则
177
+
178
+ ## 八、高级功能
179
+
180
+ ### 8.1 冻结单元格
181
+
182
+ 点击单元格设置冻结,冻结该单元格左侧和上方区域。
183
+
184
+ ### 8.2 解析优化
185
+
186
+ - **行式加载**:列表展示时优化解析速度(仅单数据集简单列表)
187
+ - **数据预聚合**:默认开启,按分组聚合逻辑解析
188
+
189
+ ### 8.3 分页设置
190
+
191
+ - 默认每页200条,最大1000条(私有化260201基线后最大2000条)
192
+ - 动态 Sheet 页:按字段值分不同 Sheet 页展示
193
+
194
+ ### 8.4 打印设置
195
+
196
+ - 打印区域:起始行/列/结束行/列
197
+ - 打印重复区域:表头重复
198
+ - 打印网格线/外框线
199
+ - 所有行/列打印在一页
200
+ - 打印顺序:自动/先行后列/先列后行
201
+ - 页边距/页眉页脚/纸张大小方向
202
+
203
+ ### 8.5 报表分栏
204
+
205
+ - 按行/列数分栏:每N行/列自动为一栏
206
+ - 按栏数分栏:整体分为N栏
207
+ - 分栏模式:垂直/水平/卡片
208
+ - 复制标题或表头
209
+
210
+ ### 8.6 按钮控制
211
+
212
+ 支持隐藏预览页面按钮,支持权限控制
213
+
214
+ ### 8.7 启用编辑/工具栏
215
+
216
+ - 启用编辑:预览页面可双击编辑数据
217
+ - 工具栏:调整字体样式、插入公式、设置打印
218
+
219
+ ## 九、公式功能
220
+
221
+ ### 9.1 公式分类
222
+
223
+ | 分类 | 常用公式 |
224
+ |------|----------|
225
+ | 文本 | LEFT, RIGHT, MID, LEN, CONCAT, UPPER, LOWER |
226
+ | 日期和时间 | YEAR, MONTH, DAY, DATE, DAYS, DATEDIF |
227
+ | 数学 | SUM, AVERAGE, COUNT, MAX, MIN, ABS, ROUND |
228
+ | 逻辑计算 | IF, IFERROR, AND, OR, NOT |
229
+ | 信息 | ISERROR, ISBLANK, ISNUMBER |
230
+ | 组合公式 | 多公式组合 |
231
+
232
+ ### 9.2 使用方式
233
+
234
+ - 在单元格直接输入 `=sum` 联想公式
235
+ - 公式 tab 选取公式插入
236
+
237
+ ### 9.3 注意事项
238
+
239
+ - 求和字段需按特定父格分组时,公式资源也需指定自定义父格
240
+ - iferror 包裹避免错误值导致计算失败
241
+ - DAYS 函数结束日期在前,开始日期在后
242
+
243
+ ## 十、填报字段
244
+
245
+ ### 10.1 字段类型
246
+
247
+ 单行文本、多行文本、整数、浮点数、日期、人力资源、部门、分部、关联浏览、下拉框、check 框
248
+
249
+ ### 10.2 显示方式
250
+
251
+ | 显示方式 | 适用字段类型 |
252
+ |----------|-------------|
253
+ | 输入框 | 单行文本、多行文本、整数、浮点数 |
254
+ | 关联浏览 | 日期、人力资源、部门、分部、关联浏览 |
255
+ | 选择框 | 下拉框 |
256
+ | check框 | check 框 |
257
+
258
+ ### 10.3 关键属性
259
+
260
+ - 控件名称:必填,可自定义
261
+ - 表字段名:自动生成字母缩写,只读
262
+ - 数据集名称:报表名+Sheet页名,只读
263
+ - 数据库名:edc_uf_tb 开头,保存后生成
264
+ - 字段属性:只读/编辑/必填
265
+ - 显示字段:默认开启,关闭后不展示
266
+
267
+ ## 十一、数据分析
268
+
269
+ - 默认分析页:开启数据分析后自动开启
270
+ - 引用已有页面:选取有权限的 e-builder 页面
271
+ - 新建分析:可新建多个分析,每个支持添加多个图表
272
+ - 参数配置:自定义传参或系统参数
273
+ - 展示宽度:像素或百分比,默认 280px
274
+ - 打开方式:仅支持右侧滑出
275
+
276
+ ## 十二、版本管理
277
+
278
+ - 存为新版本:保存当前配置为新版本
279
+ - 历史版本:查看、预览、还原
280
+ - 版本命名:报表名称-{date}-{time},支持自定义
281
+
282
+ ## 十三、报表快速构建
283
+
284
+ > **API / CLI(列表页新建)**:见 **`report-create-modes-guide.md`** — `e10-cli report create quick` · `quicklyParam`。
285
+
286
+ ### 13.1 列表式快速构建
287
+
288
+ 入口:后台管理中心 -> 报表 -> **新建报表** -> **快速构建-列表式**
289
+
290
+ - 选取数据源(支持多选)
291
+ - 设置显示字段(支持搜索)
292
+ - 主题设置
293
+ - 基础属性:列名称、列宽、对齐方式、分组、隐藏列、冻结单元格、自动换行
294
+ - 落库:`POST baseInfo` + `quicklyParam`(非设计器手工拖格)
295
+
296
+ ### 13.2 报表设计页快速构建
297
+
298
+ 入口:报表设计器 -> 添加数据集后 -> 更多按钮
299
+
300
+ 生成简单列表式报表,默认开启行式加载。载荷为设计保存时的 `quicklyParamList`(与列表页新建 `quicklyParam` 不同入口)。
301
+
302
+ ### 13.3 模版创建(同对话框另一卡片)
303
+
304
+ 入口:新建报表 -> **模版创建** → `GET getReportModels` → `POST baseInfo` 且 `reportModel={模板ID}`。详见 `report-create-modes-guide.md`。
@@ -16,15 +16,86 @@
16
16
  | workbook / designKey 错乱 | 偶发 500 或「数据不是最新」 | 回读 `designKey` | 用当次 `getReportDevInfo.designKey`;必要时新会话 |
17
17
  | **空 workbook 落库**(提交 `sheets:{}`) | 保存控制台报错 / 布局被清空 | 保存前 rebuild 后 cells=0 且 fields>0 | 从 fields 重建完整 Sheet1 + spans 再 save;**禁止**把读到的空 sheets 原样回写 |
18
18
  | **`(0,0)` 空 Const 幽灵格** | 异常格、父格误判、保存预检失败 | fields 含 x=0,y=0 且 text 空 | **删除该幽灵格**后再重建 workbook |
19
+ | **cell `transSelectOptions` 为空串 `""` 或 `{}`** | `saveReportDevInfo` → **500「报表内部错误」**(与格内容无关,最小 1 格也 500) | `e10-cli report verify all`;或看 cellType 里的空值键 | **省略该键**(只在非空数组时写入);注意 `[]`(数组,含空数组)**合法**,勿误删 —— 注意点 **BUILD-33** |
19
20
  | **workbook sheet 含 `gridline` 键** | `saveReportDevInfo` → **500「报表内部错误」**(二分:存在即 500) | `e10-cli report validate gridline` | **删除** sheets.* 上的 `gridline`/`gridLine`/`__gridline`;网格线只写 page 层 `gridLine:0\|1` |
21
+ | **`workbook` 载荷形态**(应传明文 JSON 却传了 gzip+base64) | `saveReportDevInfo` → **500「报表内部错误」**,且**与格内容无关**(1 格表 / 最小平铺表也 500) | 0 位移判别:同一 workbook 分别发「不带 / 空串 / 明文 / gzip+b64 / 明文再 b64」→ 只有**明文=200**(见 §三.0) | 改用**明文 JSON**。脚本一律走 构建层(**自适应**:先发 gzip+b64,非 200 自动回退明文)—— 注意点 **BUILD-39** |
22
+ | **multipart 缺 `et` 表单字段**(部分自建环境) | `saveReportDevInfo` → **`token empty or invalid`**(HTTP 200 body 或 401),或 500「报表内部错误」 | 对比「带/不带 `et` 字段」各发一次 | 走 `saveReportDevInfoAuto`(载荷矩阵自动追加 `et` = 当前 ETEAMSID)—— 注意点 **ENV-11** |
23
+ | **Formula 格 `refX`/`refY` 非 -1** | 不 500,但**预览第一行正常、后续行渲染乱码**(扩展带公式格) | `e10-cli report verify all`(R7) | 落库前把 `style.cellType` 的 `refX/refY` 归 -1(防御层 R7 已自动)—— 注意点 **BUILD-46** |
24
+ | **Formula 格 `subordination:[]` / `expandType:Vertical`** | 不 500,但**浏览器端渲染出 `p1900rc1900nt` 乱码**(公式区间横跨另一公式格时依赖链建不起来) | `e10-cli report verify all`(R8) | 落库前 force `subordination=["",""]` + `expandType="NoExpand"`(防御层 R8 已自动)—— 注意点 **BUILD-49** |
25
+ | **`style.formatter` 落成短码**(`common`…) | 不 500,但**预览显示字面量 `co12on`** | `e10-cli report verify all`(R9) | 按 数字格式目录 换合法格式串(防御层 R9 已自动)—— 注意点 **BUILD-47** |
20
26
 
21
27
  > **注意**:`getReportDevInfo` 回读时 `workbookProps.sheets` 常为 `{}`、`sheetCount=0`(与正常报表一致,布局在 `fields`)。判断「空 workbook」以**保存载荷**是否含 cell 为准,不要因回读 sheets 空就乱改 `groupId` 或清布局。
28
+
29
+ > ### 复制 500 的正解(2026-09-15 二次更正)
30
+ > 复制失败**只有**「数据集形态」这一列会触发,且判据是**大小写**,不是「类型叫 LOGIC」:
31
+ > - ✅ `type="logic"`(小写)= 设计器「+」/ 页面手动建表口径 → copySheet **200**
32
+ > - ❌ `type="LOGIC"`(大写)= 脚本 `addDataset` 传 `sourceType=LOGIC` 的产物 → copySheet **500**
33
+ >
34
+ > 决定性实验:同应用 + **同表单** 两张空壳,唯一差别是挂数据集时 `--source-type logic` / `--source-type LOGIC`
35
+ > → **200 / 500**。带数据集与字段的**手动建表复制本来就正常**,所以「LOGIC 一类都不可复制」的说法是错的。
36
+ > 一键处置:`e10-cli report copy-health`(诊断)→ `e10-cli report dataset heal --purge --apply`(修复)→ 复查 `copy-health`。
37
+ | **数据集 `type` 是大写 `LOGIC`**(复制 500 的**真因**) | **`GET copySheet` 复制报表 → body `code=500`「报表内部错误」**(HTTP 仍是 200);`type="logic"`(小写,即设计器/手动建表口径)→ **200**。与分组 / AI 建表 / 字段数量全都无关 | `e10-cli report copy-health --report-id <rid> --app-id <appId>`;或 `e10-cli report dataset list --report-id <rid> --app-id <appId> --raw` 看 `type` 大小写 | `e10-cli report dataset heal --report-id <rid> --app-id <appId> [--purge] --apply`(replaceDataset 原地换型,单元格 `dataSetId`/`fieldKey` 服务端自动重映射,格数/公式/布局零损失)。**源头**:新建数据集一律 `sourceType=logic`(小写),见 `add-dataset-registration-guide.md` §二;注意点 **BUILD-29** |
38
+ | **数据集 `sourceId` 为空**(半成品 / 跨应用残留) | 同样让 copySheet 报 500 | 同上(`--raw` 看 `sourceId`) | `e10-cli report dataset heal --purge --apply`(删除该脏数据集;删前自动 checkDataSetUsed) |
39
+ | **`groupId=0` 孤儿分组** | 该报表在「菜单选取 / 按分组枚举」里**列不出来**(全应用只有手动建的能被选到);**与复制 500 无关**(改成 -1 后复制仍 500,已证伪两轮) | `e10-cli report group audit --app-id <appId>`(命中 exit 3) | `e10-cli report group sync --app-id <appId> --apply`(批量对齐到页面手动建表口径 `-1`)或 `group set --report-id <rid> --group-id -1 --apply` |
22
40
  | 条件格式 `highlight:between` 等非法算子 | **不一定 500**,但规则**静默不生成** | `e10-cli report verify condition` | 改为 `highlight:interval` 等白名单 |
23
41
 
42
+ ### §三.0 · `workbook` 载荷形态判别(0 位移实验 · 注意点 BUILD-39)
43
+
44
+ **触发**:`saveReportDevInfo` 恒 500「报表内部错误」,且**连最小平铺表 / 手写 1 格 workbook 也 500**(排除布局、跨源筛选、gridline 后仍 500)。
45
+
46
+ **判别**(同一空壳 + 同一 workbook,**只换 `workbook` 字段形态**;2026-10-09 在 `<客户自建站点>` 实证):
47
+
48
+ | 载荷形态 | 结果 |
49
+ |---|---|
50
+ | 不带 `workbook` 字段 | `400` |
51
+ | 空串 `''` | `500 报表内部错误` |
52
+ | **明文 JSON** | **`200 接口返回成功`** ✅ |
53
+ | gzip + base64(技能历史默认) | `500 报表内部错误` |
54
+ | 明文 JSON 再 base64 | `500 报表内部错误` |
55
+
56
+ **结论**:部分自建环境的服务端**只接受明文 JSON**;技能历史统一发的 gzip+base64 会被解析失败 → 整表 500,**与格内容无关**。
57
+
58
+ **兼容写法(已固化到脚本)**:`spec_lib.saveReportDevInfoAuto({ reportId, appId, name, groupId, workbook, ... })` —— 先发 gzip+b64,非 200 自动回退明文。`build_from_spec` / `safe_report_save`(含 `safeSaveReportDevInfo`)/ `card_ops` / `rebuild_from_blueprint` / `restore_cell` / `restore_report_from_version` / `preagg_ops` / `formula_parent_ops` / `fix_field_binding` / `set_freeze_cells` / `fix_table_name_echo` 均已改走自适应通道。
59
+
60
+ > ⚠️ 判别实验**必须在一次性空壳上做**(save 是整份替换、无 dry-run、200 即落库)——见 `failure-cleanup-and-nonblocking-guide.md`。
61
+
62
+ ### §三.1 · 部分自建环境 `saveReportDevInfo` 硬规则(注意点 ENV-11)
63
+
64
+ > 与 §三.0 的「只认明文」环境**互斥**:另有部分自建环境要求 **gzipB64 + `et` 字段**(明文反而 500)。
65
+
66
+ | 硬规则 | 缺了会怎样 | 对策 |
67
+ |--------|-----------|------|
68
+ | multipart **必须含 `et` 表单字段** | `token empty or invalid`(HTTP 200 body / 401) | `saveReportDevInfoAuto` 载荷矩阵自动追加 `et` = 当前 ETEAMSID |
69
+ | workbook 走 **gzipB64** | 传明文 → 500「报表内部错误」 | 同上(矩阵:无 et `gzipB64` → 明文 → 有 et `gzipB64` → 有 et 明文) |
70
+ | `stripWorkbookGridlineKeys` **始终必调** | sheet 带 gridline 族键 → 500 | JS 侧 = 防御层 **R1**(`saveReportDevInfoAuto` 每次落库前自动执行);Python 侧函数名即为 `stripWorkbookGridlineKeys` |
71
+ | `ETEAMSID` **按环境隔离** | A 环境凭证在 B 环境同样报 token invalid | 按 host 分别保存凭证;**失效直接向用户索要新的,勿反复重试** |
72
+ | `ETEAMSID` **会过期** | 报「登录超时」 | 重新 `e10-cli auth status` / 请用户给新值 |
73
+ | 沙箱 **`spawn EBUSY`** | 拿不到凭证 | 统一走 **env 三件套**:`EB_HOST` + `EB_ETEAMSID` + `EB_AUTH_NO_CLI=1`(零 spawn) |
74
+
75
+ ```bash
76
+ e10-cli auth status
77
+ `e10-cli report verify all`
78
+ export EB_HOST='<平台地址>' EB_ETEAMSID='<值>' EB_AUTH_NO_CLI=1
79
+ ```
80
+
24
81
  ---
25
82
 
26
83
  ## 二、强制校验门禁(落库前 / 交付前)
27
84
 
85
+ > **★ 一键体检(首选)**:所有已知 500 成因已收口到 ``,用**一条命令**查完/修完:
86
+ >
87
+ > ```bash
88
+ > `e10-cli report verify all`
89
+ > `e10-cli report verify all`
90
+ > `e10-cli report verify all`
91
+ > ```
92
+ >
93
+ > **`saveReportDevInfoAuto` 每次落库前已自动过防御层**(剔除 gridline 族键 / transSelectOptions 空串 /
94
+ > (0,0) 幽灵格 + 规范化 name/nameLabelId),任何调用方传脏 workbook 也不会再因这些成因 500;
95
+ > `EB_SAVE_NO_SANITIZE=1` 可关闭(仅对照诊断)。载荷形态(gzip vs 明文)仍由该通道自适应回退。注意点 **BUILD-41**。
96
+ >
97
+ > 下列细分门禁仍可用于**定点校验**:
98
+
28
99
  ```bash
29
100
  # 1) base 元数据(防列表 500)
30
101
  e10-cli report validate base --name "报表名" --name-label-id -1 --group-id 0
@@ -1,6 +1,6 @@
1
1
  # e-Builder 报表功能知识库
2
2
 
3
- > **冷启动禁止通读**:见 `cold-start-scan-guide.md`。仅文档与引擎冲突、或用户要源码级对齐时再读相关节(优先第九节)。
3
+ > **冷启动禁止通读**:见 `api-report-build-fast-path.md`。仅文档与引擎冲突、或用户要源码级对齐时再读相关节(优先第九节)。
4
4
 
5
5
  ## 一、报表设计器布局
6
6
 
@@ -55,7 +55,7 @@
55
55
  - **分组**:相同值合并显示为一条
56
56
  - **排列**:所有数据一一展示,不合并
57
57
  - **汇总**:按父格分组进行聚合计算
58
- - 汇总方式:求和、计数、计数(去重)、最大值、最小值、平均值
58
+ - 汇总方式:求和、计数、计数(去重)、最大值、最小值、平均值
59
59
  - **树形**:按字段上下级关系分层级展示
60
60
  - **隐藏内容**:分组后可隐藏明细,仅显示分组汇总
61
61
 
@@ -305,9 +305,9 @@ I5~J5(交叉后字段): 左父格自定义E5, 上父格默认, 纵向扩展
305
305
 
306
306
  ### 9.1 引擎选择与报表类型映射(代码事实)
307
307
  - 渲染引擎工厂 `Engine.getInstance(sheet.getQuickType())`(`SplitUtilThread.java:70` / `Engine.java:18-26`):
308
- - `QuickType.Custom` → `CustomEngine`(自由布局,手动指定左/上父格坐标)
309
- - `QuickType.SimpleList` → `SimpleListEngine`(行式列表,无分组聚合)
310
- - 其它(默认)→ `GroupCrossEngine`(分组 + 交叉,x 列维 / y 行维 / z 度量)
308
+ - `QuickType.Custom` → `CustomEngine`(自由布局,手动指定左/上父格坐标)
309
+ - `QuickType.SimpleList` → `SimpleListEngine`(行式列表,无分组聚合)
310
+ - 其它(默认)→ `GroupCrossEngine`(分组 + 交叉,x 列维 / y 行维 / z 度量)
311
311
  - **结论**:报表类型不是用户随意选的"展示形态",而是由底层 `QuickType` 决定走哪套引擎;分组/交叉/树形/合计均运行在 `GroupCrossEngine` 之上。
312
312
 
313
313
  ### 9.2 父格解析与循环依赖(代码事实)
@@ -321,9 +321,9 @@ I5~J5(交叉后字段): 左父格自定义E5, 上父格默认, 纵向扩展
321
321
  - 枚举 `AnalysisExpandType` = `NoExpand / Horizontal / Vertical`;标题格默认 `Horizontal`。
322
322
  - 真实扩展由 `AnalysisUtil.expandCell` + `OffSet` 偏移实现:子格被推到父格扩展末端;交叉区在 `BaseEngine.analysisCrossField` 按 `leftParent×topParent` 坐标分组,取首个可扩展子格类型决定整体方向。
323
323
  - **聚合算法**(`DataSetEngine.getListLikeMap`):
324
- - `sum`:`BigDecimal` 累加,初值 `ZERO`;`min/max`:流比较;`avg`:`sum/size`,`divide(scale=10, ROUND_HALF_UP)`,`size==0` 返回 `ZERO`;`count`:分组数据集取 `s_*_*` 整数字段求和,否则计非空 map 数;`distinctcount`:按 `dataSetKey` 去重。
325
- - **Null 处理**:`sum/min/max` 用 `getBigDecimalValue(v, ZERO)`(null→0);`avg` 先过滤 null 再除;聚合 key 用 `NumberFormat` 最多 10 位小数。
326
- - **预聚合(SQL 下推)**:当"全部分组字段可分组、无自定义/结果筛选、排序仅含分组字段"时,`BaseEngine.initDataSetByGroup` 构造 `EdcDatasetAggregateDto(groupBy+countType)` 走 `queryForListGroupByFields`,打 `QuickTypeTag=GroupQuery`。
324
+ - `sum`:`BigDecimal` 累加,初值 `ZERO`;`min/max`:流比较;`avg`:`sum/size`,`divide(scale=10, ROUND_HALF_UP)`,`size==0` 返回 `ZERO`;`count`:分组数据集取 `s_*_*` 整数字段求和,否则计非空 map 数;`distinctcount`:按 `dataSetKey` 去重。
325
+ - **Null 处理**:`sum/min/max` 用 `getBigDecimalValue(v, ZERO)`(null→0);`avg` 先过滤 null 再除;聚合 key 用 `NumberFormat` 最多 10 位小数。
326
+ - **预聚合(SQL 下推)**:当"全部分组字段可分组、无自定义/结果筛选、排序仅含分组字段"时,`BaseEngine.initDataSetByGroup` 构造 `EdcDatasetAggregateDto(groupBy+countType)` 走 `queryForListGroupByFields`,打 `QuickTypeTag=GroupQuery`。
327
327
  - **合计/小计不自动插入**:引擎不会自动加合计行。合计由设计器在分组旁放置一个 `AnalysisDisplayType.Count` 单元格实现(其聚合值即渲染值);树形字段组内合计通过 `groupCountConfig`(location first/last)插入;总计 `COMB_GRAND_TOTAL` → 转 `SUM(...)`。
328
328
  - **占比/同环比是公式,不在 Java 端计算**:`AnalysisField.initFormula` 中 `COMB_GROWTH_RATE/COMB_DYNAMIC_RATE/COMB_DIFF` 仅生成 `IFERROR+原串`,`COMB_GRAND_TOTAL` 生成 `SUM+原串`;同比增长率/环比/差值的具体算术在 **SpreadJS 前端计算引擎**执行,Java 端无对应算式。
329
329
 
@@ -332,30 +332,30 @@ I5~J5(交叉后字段): 左父格自定义E5, 上父格默认, 纵向扩展
332
332
  - **应用位置**:仅在结果集映射阶段、且只对 `field.isDate()` 字段触发(`YunConnect/LocalViewConnect/DataSetConnect` 的 `switchDate`)。
333
333
  - **唯一转换**:`DateUtil.timeZoneTransfer` 写死 `source="0"、target="+8"`,即"假定源是 GMT+0,转成 GMT+8";server→DB 方向无任何转换。
334
334
  - `switchDate` 分支条件(`YunConnect` 为例):
335
- - `length==13`(epoch 毫秒)→ 用 JVM 默认时区 `format "yyyy-MM-dd HH:mm:ss"`
336
- - `length==21` → `substring(0,19)`,无转换
337
- - `length==29 && contains("T")` → 触发 `timeZoneTransfer`(**唯一时区转换分支**)
338
- - 其它 → 原样返回
339
- - **隐式规则(极易踩坑)**:
340
- 1. 源时区被忽略:即使 ISO 串自带偏移(如 `+09:00`),代码先 `substring(0,19)` 丢弃偏移再硬按 `GMT+0` 解析,非 UTC 源会算错。
341
- 2. 设计预览 ≠ 运行预览:`EdcReportDevDesignServiceImpl.switchDate`(设计态)只有 13/21 两个分支,**没有 `T` 的时区转换分支**——设计预览不做 +8,运行态做。
342
- 3. 13 位毫秒分支依赖 JVM 默认时区(无显式 setTimeZone),仅因服务器通常在国内才"恰巧"+8;非 +8 服务器此处结果偏移。
343
- 4. 只对 `isDate()` 字段生效;基础类型、Map/List、select/browser 字段一律跳过。
344
- 5. 多数据库(mysql/oracle/sqlserver/pg/dm)**无差异**:无 `convert_tz/FROM_TZ/AT TIME ZONE`,时区逻辑纯 Java 层。
335
+ - `length==13`(epoch 毫秒)→ 用 JVM 默认时区 `format "yyyy-MM-dd HH:mm:ss"`
336
+ - `length==21` → `substring(0,19)`,无转换
337
+ - `length==29 && contains("T")` → 触发 `timeZoneTransfer`(**唯一时区转换分支**)
338
+ - 其它 → 原样返回
339
+ - **隐式规则(极易注意)**:
340
+ 1. 源时区被忽略:即使 ISO 串自带偏移(如 `+09:00`),代码先 `substring(0,19)` 丢弃偏移再硬按 `GMT+0` 解析,非 UTC 源会算错。
341
+ 2. 设计预览 ≠ 运行预览:`EdcReportDevDesignServiceImpl.switchDate`(设计态)只有 13/21 两个分支,**没有 `T` 的时区转换分支**——设计预览不做 +8,运行态做。
342
+ 3. 13 位毫秒分支依赖 JVM 默认时区(无显式 setTimeZone),仅因服务器通常在国内才"恰巧"+8;非 +8 服务器此处结果偏移。
343
+ 4. 只对 `isDate()` 字段生效;基础类型、Map/List、select/browser 字段一律跳过。
344
+ 5. 多数据库(mysql/oracle/sqlserver/pg/dm)**无差异**:无 `convert_tz/FROM_TZ/AT TIME ZONE`,时区逻辑纯 Java 层。
345
345
 
346
346
  ### 9.5 参数校验与静默改值(代码事实)
347
347
  - **报表名校验不在保存事务内**:`checkReportName`(`EdcReportDevBaseServiceImpl:2758-2784`)在新增时校验许可数量(`count>aliveCount && aliveCount!=-1 → OUT_OF_NUMBER`)与重名(`SAME_NAME`);但 `saveReportDevInfo/doAddReportBaseInfo` 自身不调用该检查,仅前端先调 `checkReportName` 防御——**保存事务内无二次校验**。
348
348
  - **乐观锁**:`designKey` 与缓存不符 → "您当前的数据不是最新的,请重新打开获取最新的数据!"(label 284414)。
349
349
  - **查询参数解析**(`QueryParamsBuilder`):
350
- - 字段名按固定格式 `name.split('.')[2]` 解析;名称不含 2 个 `.` 会 `ArrayIndexOutOfBoundsException`,无格式校验。
351
- - 别名 `length>25` 时生成 `f_<uuid>` 别名。
352
- - **缺失必填参数不报错**,仅跳过该 filter(`filterList.isEmpty → new ArrayList`),查询照常执行。
353
- - `SELECT` 非数字值兜底:有 `selectId` 用 `selectId`,否则非数字 value 置 `"-1"`。
354
- - **SQL 注入防护**:`sql_where` 类型经 `LZString.decompress → buildOnlySearchField`(占位符 `searchfield00x`)→ `QueryFilterBiz.buildSqlWhereParams` 参数化,未见原始拼接。
355
- - 范围值拆分:日期/数字 EQ/RANGE 拆 GTE+LTE;数字 NEQ 拆 LT+GT 并生成新 groupId;其它 func 不合法时"不做处理"。
350
+ - 字段名按固定格式 `name.split('.')[2]` 解析;名称不含 2 个 `.` 会 `ArrayIndexOutOfBoundsException`,无格式校验。
351
+ - 别名 `length>25` 时生成 `f_<uuid>` 别名。
352
+ - **缺失必填参数不报错**,仅跳过该 filter(`filterList.isEmpty → new ArrayList`),查询照常执行。
353
+ - `SELECT` 非数字值兜底:有 `selectId` 用 `selectId`,否则非数字 value 置 `"-1"`。
354
+ - **SQL 注入防护**:`sql_where` 类型经 `LZString.decompress → buildOnlySearchField`(占位符 `searchfield00x`)→ `QueryFilterBiz.buildSqlWhereParams` 参数化,未见原始拼接。
355
+ - 范围值拆分:日期/数字 EQ/RANGE 拆 GTE+LTE;数字 NEQ 拆 LT+GT 并生成新 groupId;其它 func 不合法时"不做处理"。
356
356
  - **静默改值(不抛异常)**(`ReportConfigConverter.applyDefaultFieldValues`):
357
- - `xCount<=0→1`、`yCount<=0→1`;空 JSON 数组默认 `[]`;`orderType` 空→`"no"`、`openType` 空→`"blank"`、`thumbnail` 空→`"NoDisplay"`、`subordination` 空→`"[\"\",\"\"]"`、`valueCompletion`→`"{}"`;`colVisible/rowVisible` 空→`"1"`;`cellType=="Field" && transType` 空→`"default"`;`refX==0&&refY==0 → refX=refY=-1`。
358
- - 设计服务中字段 `cellType` 为 null/空串时**静默跳过该单元格**(不入库)。
357
+ - `xCount<=0→1`、`yCount<=0→1`;空 JSON 数组默认 `[]`;`orderType` 空→`"no"`、`openType` 空→`"blank"`、`thumbnail` 空→`"NoDisplay"`、`subordination` 空→`"[\"\",\"\"]"`、`valueCompletion`→`"{}"`;`colVisible/rowVisible` 空→`"1"`;`cellType=="Field" && transType` 空→`"default"`;`refX==0&&refY==0 → refX=refY=-1`。
358
+ - 设计服务中字段 `cellType` 为 null/空串时**静默跳过该单元格**(不入库)。
359
359
  - **AI 配置保存**(`ReportConfigSaveServiceImpl`):`@Transactional(rollbackFor=Exception.class)`;`validateParams` 仅做循环依赖检查;`user==null → ReportException("user is required")`;更新路径只补齐缺失 sheet 不删已有;按 `uniqKey` 增量增/改/删,重复 `uniqKey` 跳过。
360
360
 
361
361
  ### 9.6 多端差异化(代码事实)
@@ -382,7 +382,7 @@ I5~J5(交叉后字段): 左父格自定义E5, 上父格默认, 纵向扩展
382
382
  | 合计行由报表自动生成 | 引擎不自动插入合计,需手动放 `Count` 单元格 | 合计/小计均为手动放置 |
383
383
  | 同环比在后端计算 | `COMB_*` 仅生成 `IFERROR/SUM` 公式串,算术在 SpreadJS 前端 | 占比/同环比是前端公式 |
384
384
  | API 写入公式与手动相同(带 `=`) | `EdcReportDevDesignServiceImpl` 原样持久化 `cell.getFormula()`;设计器保存去 `=` | API 存储 `cellText` **无前导 `=`**,见 `formula-cell-api-guide.md` |
385
- | IF 公式 API 不可用 | 为 `=` 前缀 + 错误 countType/displayType 导致空白 | IF/IFERROR 可用,须 `countType=count`、`displayType=Group` |
385
+ | IF 公式 API 不可用 | 验证为 `=` 前缀 + 错误 countType/displayType 导致空白 | IF/IFERROR 可用,须 `countType=count`、`displayType=Group` |
386
386
  | 报表支持配置时区 | 全仓库无时区配置字段,写死 GMT+8 且仅 isDate 字段、运行态才转换 | 时区不可配置、仅运行态+8 |
387
387
  | 保存时会校验报表名/重名 | `checkReportName` 不在保存事务内,仅前端防御 | 后端保存事务不二次校验重名 |
388
388
  | 移动端自动适配 | 无 UA 嗅探,靠 `isMobile` 参数 + `belong`/`mbhreflink` 元数据 | 必须显式配置 belong=MOBILE |