weaver-e10-builder 1.5.15 → 1.5.16

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 (129) hide show
  1. package/dist/commands/form-add-detail-table.d.ts.map +1 -1
  2. package/dist/commands/form-add-detail-table.js +37 -17
  3. package/dist/commands/form-add-detail-table.js.map +1 -1
  4. package/dist/commands/form-list-custom.d.ts +5 -0
  5. package/dist/commands/form-list-custom.d.ts.map +1 -0
  6. package/dist/commands/form-list-custom.js +24 -0
  7. package/dist/commands/form-list-custom.js.map +1 -0
  8. package/dist/commands/form-list-search-group.d.ts.map +1 -1
  9. package/dist/commands/form-list-search-group.js +101 -7
  10. package/dist/commands/form-list-search-group.js.map +1 -1
  11. package/dist/commands/form-list.d.ts.map +1 -1
  12. package/dist/commands/form-list.js +45 -1
  13. package/dist/commands/form-list.js.map +1 -1
  14. package/dist/commands/form-permission.d.ts.map +1 -1
  15. package/dist/commands/form-permission.js +10 -8
  16. package/dist/commands/form-permission.js.map +1 -1
  17. package/dist/commands/form.d.ts.map +1 -1
  18. package/dist/commands/form.js +54 -5
  19. package/dist/commands/form.js.map +1 -1
  20. package/dist/commands/menu.d.ts.map +1 -1
  21. package/dist/commands/menu.js +98 -1
  22. package/dist/commands/menu.js.map +1 -1
  23. package/dist/commands/report-cell.d.ts +3 -0
  24. package/dist/commands/report-cell.d.ts.map +1 -0
  25. package/dist/commands/report-cell.js +365 -0
  26. package/dist/commands/report-cell.js.map +1 -0
  27. package/dist/commands/wf-form.d.ts +2 -0
  28. package/dist/commands/wf-form.d.ts.map +1 -1
  29. package/dist/commands/wf-form.js +10 -9
  30. package/dist/commands/wf-form.js.map +1 -1
  31. package/dist/commands/workflow-base-command.js +1 -1
  32. package/dist/commands/workflow-base-command.js.map +1 -1
  33. package/dist/commands/workflow-basic-info.d.ts +5 -0
  34. package/dist/commands/workflow-basic-info.d.ts.map +1 -0
  35. package/dist/commands/workflow-basic-info.js +47 -0
  36. package/dist/commands/workflow-basic-info.js.map +1 -0
  37. package/dist/commands/workflow-create-workflow.d.ts.map +1 -1
  38. package/dist/commands/workflow-create-workflow.js +49 -83
  39. package/dist/commands/workflow-create-workflow.js.map +1 -1
  40. package/dist/commands/workflow-function-settings.d.ts.map +1 -1
  41. package/dist/commands/workflow-function-settings.js +3 -2
  42. package/dist/commands/workflow-function-settings.js.map +1 -1
  43. package/dist/commands/workflow.d.ts.map +1 -1
  44. package/dist/commands/workflow.js +19 -37
  45. package/dist/commands/workflow.js.map +1 -1
  46. package/dist/index.js +4 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/services/form-field-build.d.ts +13 -0
  49. package/dist/services/form-field-build.d.ts.map +1 -1
  50. package/dist/services/form-field-build.js +18 -0
  51. package/dist/services/form-field-build.js.map +1 -1
  52. package/dist/services/form-field-dataset.d.ts +101 -0
  53. package/dist/services/form-field-dataset.d.ts.map +1 -0
  54. package/dist/services/form-field-dataset.js +180 -0
  55. package/dist/services/form-field-dataset.js.map +1 -0
  56. package/dist/services/form-field-template.d.ts +15 -10
  57. package/dist/services/form-field-template.d.ts.map +1 -1
  58. package/dist/services/form-field-template.js +30 -15
  59. package/dist/services/form-field-template.js.map +1 -1
  60. package/dist/services/form-layout-insert.d.ts +22 -0
  61. package/dist/services/form-layout-insert.d.ts.map +1 -1
  62. package/dist/services/form-layout-insert.js +88 -8
  63. package/dist/services/form-layout-insert.js.map +1 -1
  64. package/dist/services/form-list-search-custom.d.ts +25 -0
  65. package/dist/services/form-list-search-custom.d.ts.map +1 -0
  66. package/dist/services/form-list-search-custom.js +98 -0
  67. package/dist/services/form-list-search-custom.js.map +1 -0
  68. package/dist/services/form-list-search-group.d.ts +36 -2
  69. package/dist/services/form-list-search-group.d.ts.map +1 -1
  70. package/dist/services/form-list-search-group.js +89 -10
  71. package/dist/services/form-list-search-group.js.map +1 -1
  72. package/dist/services/form-list-search.d.ts +1 -0
  73. package/dist/services/form-list-search.d.ts.map +1 -1
  74. package/dist/services/form-list-search.js +5 -2
  75. package/dist/services/form-list-search.js.map +1 -1
  76. package/dist/services/form-permission-archive.d.ts +15 -2
  77. package/dist/services/form-permission-archive.d.ts.map +1 -1
  78. package/dist/services/form-permission-archive.js +22 -3
  79. package/dist/services/form-permission-archive.js.map +1 -1
  80. package/dist/services/form-physical-table.d.ts +17 -0
  81. package/dist/services/form-physical-table.d.ts.map +1 -1
  82. package/dist/services/form-physical-table.js +19 -0
  83. package/dist/services/form-physical-table.js.map +1 -1
  84. package/dist/services/form-sub-detail.d.ts +11 -0
  85. package/dist/services/form-sub-detail.d.ts.map +1 -1
  86. package/dist/services/form-sub-detail.js +23 -0
  87. package/dist/services/form-sub-detail.js.map +1 -1
  88. package/dist/services/menu-catalog.d.ts +11 -0
  89. package/dist/services/menu-catalog.d.ts.map +1 -1
  90. package/dist/services/menu-catalog.js +32 -0
  91. package/dist/services/menu-catalog.js.map +1 -1
  92. package/dist/services/report/cell-edit.d.ts +53 -0
  93. package/dist/services/report/cell-edit.d.ts.map +1 -0
  94. package/dist/services/report/cell-edit.js +137 -0
  95. package/dist/services/report/cell-edit.js.map +1 -0
  96. package/dist/services/report/cell-event.d.ts +28 -0
  97. package/dist/services/report/cell-event.d.ts.map +1 -0
  98. package/dist/services/report/cell-event.js +71 -0
  99. package/dist/services/report/cell-event.js.map +1 -0
  100. package/dist/services/report/cell-filter.d.ts +46 -0
  101. package/dist/services/report/cell-filter.d.ts.map +1 -0
  102. package/dist/services/report/cell-filter.js +153 -0
  103. package/dist/services/report/cell-filter.js.map +1 -0
  104. package/dist/services/workflow-basic-info.d.ts +27 -0
  105. package/dist/services/workflow-basic-info.d.ts.map +1 -0
  106. package/dist/services/workflow-basic-info.js +170 -0
  107. package/dist/services/workflow-basic-info.js.map +1 -0
  108. package/dist/services/workflow-function-management.d.ts +1 -1
  109. package/dist/services/workflow-function-settings.d.ts +1 -0
  110. package/dist/services/workflow-function-settings.d.ts.map +1 -1
  111. package/dist/services/workflow-function-settings.js +10 -2
  112. package/dist/services/workflow-function-settings.js.map +1 -1
  113. package/dist/services/workflow-watermark-template.d.ts +8 -0
  114. package/dist/services/workflow-watermark-template.d.ts.map +1 -0
  115. package/dist/services/workflow-watermark-template.js +78 -0
  116. package/dist/services/workflow-watermark-template.js.map +1 -0
  117. package/package.json +1 -1
  118. package/skill-docs/SKILL.md +4 -4
  119. package/skill-docs/references/common/ref-cli-commands.md +696 -695
  120. package/skill-docs/references/form/guide-form-archive-permission.md +5 -2
  121. package/skill-docs/references/form/guide-form-layout-incremental.md +6 -4
  122. package/skill-docs/references/form/guide-form-view.md +423 -374
  123. package/skill-docs/references/form/ref-form-fields.md +1 -1
  124. package/skill-docs/references/report/cross-dataset-filter-guide.md +33 -19
  125. package/skill-docs/references/report/event-hreflink-guide.md +30 -0
  126. package/skill-docs/references/report/ref-report-commands.md +14 -0
  127. package/skill-docs/references/report/report-designer-feature-map.md +2 -2
  128. package/skill-docs/references/workflow/guide-function-settings.md +112 -55
  129. package/skill-docs/references/workflow/guide-workflow.md +632 -630
@@ -1,374 +1,423 @@
1
- # 表单视图:新建与验收
2
-
3
- 表单创建后已有默认台账;只有用户明确需要额外视图时才创建。表格视图是 `nListView` 数据列表,和普通 `formView` 是两条不同链路。
4
-
5
- ## 需求判别
6
-
7
- - “新建表单” → `form create --fields`。
8
- - “客户信息表需要一个客户信息视图”等普通列表需求 → 先查询并复用该表单默认台账;“客户信息表”和“客户信息”的名称差异不构成额外新建理由。
9
- - “在已有表单下明确新增一个额外表格视图” → `form table-view create`;命令必须同时保存显示列并回读。
10
- - “在已有表单下新增表单视图” → `form view create --type formView`,随后必须 `form view populate`;不得新建另一张表单。
11
-
12
- ## 默认台账复用
13
-
14
- 1. 用 `form list-view <objId> <appId>` 查询已有列表,确认目标属于当前表单且用途符合需求,记录实际名称和 listId。存在多个候选时核对数据范围、权限和展示配置,不仅凭名称或第一条记录选择。
15
- 2. 普通列表需求直接在该 listId 上配置显示列、筛选、排序、统计和事件;需要整组配置显示列时用 `form list-columns <objId> <appId> <listId> --set @columns.json`。`table-view ensure` 只用于空列补齐,不负责视图选择或重命名。
16
- 3. 默认视图名称由平台随表单生成,不应机械沿用或统一去掉末尾“表”字。需求明确给出视图名称且与默认名称不一致时,使用 `form view rename` 修改已有视图并保留 ID;不要新建同用途视图代替改名。表单名、视图名和菜单名分别处理(表单名本身用 `form rename <objId> <appId> <新名称>` 改;它和视图名、菜单名互不影响)。例如表单“客户类型表”的视图要求为“客户类型”时,应把默认台账改名为“客户类型”,不能写成“同客户类型”。
17
- 多出来的视图用 `form view delete` 删掉(**不可逆、无回收站**),命令会在删完回读确认确实没了。
18
- 4. 只有明确需要“我的客户”“重点客户”等额外独立视图,或不同展示类型时,才进入新增流程。已有重复视图需先核对菜单、关联页签等引用及配置,不能自动删除。
19
-
20
- 例如:已建“客户信息表”,方案中的“客户信息视图”可由其默认台账满足,plan 标记“复用默认台账”,填写实际 listId 即可。
21
-
22
- ## 命令
23
-
24
- ```bash
25
- # 查询表单下全部视图
26
- e10-cli form view list <objId> <appId>
27
-
28
- # 修改已有默认台账名称(viewId 从上一条命令取得)
29
- e10-cli form view rename <objId> <appId> <viewId> "客户类型"
30
-
31
- # 创建可用表格视图;默认放入全部已有字段
32
- e10-cli form table-view create <objId> <appId> "审批数据表格" --pc-only
33
-
34
- # 创建看板视图(默认 PC + FLOW 布局)
35
- e10-cli form view create <objId> <appId> "按状态看板" --type kanbanView
36
-
37
- # 新增表单视图——流式布局(FLOW)
38
- e10-cli form view create <objId> <appId> "新增-流式视图" --type formView --layout-type FLOW
39
-
40
- # 新增表单视图——表格式布局(EXCEL)
41
- e10-cli form view create <objId> <appId> "新增-EXCEL视图" --type formView --layout-type EXCEL
42
-
43
- # 第 2 步:把已有字段按目标布局类型填入新建 formView(流式/EXCEL 各自生成对应组件)
44
- e10-cli form view populate <objId> <appId> <viewId>
45
-
46
- # 创建移动端日历视图
47
- e10-cli form view create <objId> <appId> "交付日历" \
48
- --type calendarView --terminal MOBILE --layout-type FLOW
49
- ```
50
-
51
- **给已有表单加表单视图是两步闭环**(缺一不可):
52
- 1. `form view create --type formView --layout-type FLOW|EXCEL` —— 建一个**空**的 formView 实体,`--layout-type` 决定流式(FLOW)还是表格式(EXCEL)。同一张表单可同时存在多个 formView,布局类型可不同(如一张表既加流式视图又加 EXCEL 视图)。
53
- 2. `form view populate <objId> <appId> <viewId>` —— 把已有字段按目标布局类型填进去。流式视图生成流式组件、EXCEL 视图生成表格定位,**不得把 EXCEL 定位直接复制到 FLOW 视图**。
54
-
55
- `form view populate` 以原表单 `formId` 读取字段,以新视图 `viewId` 作为 `layoutMultiId` 读取目标布局,再按目标的 FLOW/EXCEL 类型重新生成字段组件并独立回读。不得把视图的 `versionId` 或 `pageLayoutId` 当成 `formId`。
56
-
57
- **视图里已经有字段时,`populate` 是「只补缺」**:只把后来新增、视图里还没有的字段补进去,
58
- **已有组件的排版与属性一个不动**(重跑幂等,已齐就只回一句「已有完整字段布局」)。
59
- 所以「表单加了字段、要让它出现在某个视图里」也走这条 —— 不必删视图重建。
60
-
61
- 字段的**物理表归属**会一并带进组件:表单在「字段管理 → 其他」里加过附属物理表(一张表单多张物理表)时,
62
- 字段列表会把各张物理表的字段一起返回,`populate` 按每个字段自己的物理表归属写入组件,
63
- 附属表的字段在视图里挂对表、不会被平台按主表校验拒掉
64
- (被拒的报错就是 `此字段不属于当前物理表,不能更改位置`)。
65
-
66
- ## 复制 / 设默认 / 删除一套布局
67
-
68
- 设计器里视图卡片右键的三个动作,各有对应命令(都在 `form layout` 组下,不是 `form view`):
69
-
70
- ```bash
71
- # 复制(复制出来的不是默认布局)
72
- e10-cli form layout copy <objId> <appId> --from <源布局ID> [--name <新名>]
73
-
74
- # 设为默认
75
- e10-cli form layout set-default <objId> <appId> <布局ID> [--for all|add|view|edit]
76
-
77
- # 删除(⚠ 不可逆)
78
- e10-cli form layout delete <objId> <appId> <布局ID>
79
- ```
80
-
81
- - **复制**:`--from` 传的是**视图 ID**(`form view list` 能查到)。平台**不回新布局 ID**,
82
- 命令靠自己复制前后各读一次列表反查,报出来的 `layoutId=` 就是新的那套。`--name` 缺省沿用源布局名。
83
- - **设默认的 `--for` 是「用途档位」,不是 FLOW/EXCEL 那个布局类型**:`all` 全部布局 /
84
- `add` 新建布局 / `view` 显示布局 / `edit` 编辑布局,缺省 `all`(也收中文说法)。
85
- **一套布局同时只承担一个档位** —— 把同一套从 `add` 改成 `view`,`add` 就没了;
86
- 「新建用一套、显示用另一套」是靠**三套不同布局各占一档**。只有 `all` 会让视图的 `default` 变 `true`。
87
- - **删除**:`layoutId` 传视图 ID。删完**回读确认列表里确实没了**才算成功(平台会「返回成功但没删掉」)。
88
- 这套布局原先占着某个档位的话,命令会一并打出来。⚠ **不可逆**;删掉正占着 `all` 的那套会怎样**未验证**,慎用。
89
-
90
- 看板、日历、思维导图目前只确认创建实体和视图列表回读,尚不能据此宣称设计器已有可用组件。
91
-
92
- 普通 `form view create --type` 只接受:
93
-
94
- - `formView`:详情视图
95
- - `kanbanView`:看板视图
96
- - `calendarView`:日历视图
97
- - `mindMapView`:思维导图视图
98
- - `multiView`:多维表格视图(无 layoutType/terminalType,带 `extConfig:{listVersion:5}`)。**数据维度**:缺省主表(`subFormId:""/subFormMain:false`);明细表维度用 `--detail <明细名>`(按名解析明细 subFormId)或 `--sub-form-id <明细subFormId>`(直传),传值即 `subFormId:<明细subFormId>/subFormMain:true`。明细子表名/subFormId 用 `dataset/v1/getFields` detailFields 查(真 subFormId 在 `fields[].subFormId`,非 `dt.id`)。**多维表格显示列**复用台账同一套 `saveNListConfig/getNListConfig`,直接用 `form list-columns <objId> <appId> <multiView的viewId> --add <fieldId>` 加列。
99
-
100
- `tableView`/`nListView` 不得传给普通视图命令。真实表格视图固定使用 `form table-view create`。
101
-
102
- ## 额外表格视图新建闭环
103
-
104
- ```bash
105
- # 1. 已确认需要额外独立视图,再查询目标表单和已有列表
106
- e10-cli form list <appId>
107
- e10-cli form list-view <objId> <appId>
108
-
109
- # 2. 创建 nListView、写入全部业务显示列和隐藏数据主键、独立回读
110
- e10-cli --json form table-view create <objId> <appId> "<表格视图名>" --pc-only
111
-
112
- # 3. 再次独立查询表单下列表
113
- e10-cli --json form list-view <objId> <appId>
114
- ```
115
-
116
- 命令先用 `viewType=nListView` 创建,再以新 `listId` 读取 PC 配置;业务列必须取自 `/api/ebuilder/common/ds/fields` 的完整字段对象,不能只拼字段 ID。保存时保留服务端配置和隐藏主键 `id=5`,最后回读 `tableField` 和列表实体。命令只拦截完全同名的视图,不识别简称或业务用途;执行前必须完成复用判断,不能因名称未完全匹配就新建。已有同名视图时停止,不盲目重建。
117
-
118
- `--pc-only` 只用于已确认本次验收为 PC 的场景。未指定时,命令必须取得真实 MOBILE 配置,禁止用 PC 配置推导移动端。
119
-
120
- `create` / `ensure` 同样支持 `--terminal pc|mobile`(缺省 `pc`):决定显示列写进哪一端,另一端原样保留。只给某一端配显示列时用 `--terminal`,两端都要就分两次执行。
121
-
122
- ```bash
123
- # 只给移动端补显示列,PC 端配置不动
124
- e10-cli --json form table-view create <objId> <appId> "移动端表格" --terminal mobile
125
- ```
126
-
127
- 服务器通过必须同时满足:
128
-
129
- - 创建后按返回 `listId` 找到同名列表。
130
- - `persisted=true`。
131
- - `visibleFieldCount` 等于目标业务字段数。
132
- - `tableFieldCount` 还包含隐藏主键。
133
- - 再查 `form list-view` 仍能按相同 ID 和名称找到。
134
-
135
- 前端无数据时可以没有数据行,但必须看见业务字段列头;否则仍是空壳,不能验收。
136
-
137
- ## 表格视图展示样式
138
-
139
- ```bash
140
- e10-cli --json form table-view style <objId> <appId> <listId> <style>
141
- ```
142
-
143
- `style` 使用前台语义,不直接让使用者猜内部 `mode`:
144
-
145
- | style | 前台展示样式 | mode |
146
- |---|---|---|
147
- | `table` | 表格式 | `1` |
148
- | `list` | 列表式 | `2` |
149
- | `left-diagram` | 左图式 | `3` |
150
- | `horizontal-list` | 横向列表式 | `4` |
151
- | `above` | 上图式 | `5` |
152
- | `grid` | 网格列表式 | `7` |
153
- | `editable` | 可编辑表格(编辑态) | `11` |
154
-
155
- 可编辑表格内部还有数据态 `8` 和只读态 `9`;用户要求“改成可编辑表格”时必须使用编辑态 `11`,不得把只读态 `9` 当成完成。
156
-
157
- 命令先确认 `listId` 属于目标 `objId`,读取目标终端的完整配置后只修改其顶层 `mode`,保存后重新读取该终端配置核对。
158
-
159
- PC 与移动端是**两个独立槽位**(保存接口的 `config` 落 PC、`mConfig` 落移动端),`--terminal` 决定改哪一端,缺省 `pc`:
160
-
161
- - `--terminal pc`:只改 PC,移动端配置原样回传;
162
- - `--terminal mobile`:只改移动端,PC 配置原样回传。
163
-
164
- 末尾会回显实际落点与另一端状态(`终端: 移动端(另一端配置保持原样)`)。另一端配置读取不到时,只有明确 `--pc-only` 才允许继续;`--terminal mobile` 与 `--pc-only` 互斥,同时传会直接报错——不要用 `--pc-only` 去改移动端。
165
-
166
- ```bash
167
- # 只把移动端改成网格列表式,PC 展示样式保持不动
168
- e10-cli --json form table-view style <objId> <appId> <listId> grid --terminal mobile
169
- ```
170
-
171
- 前端验收:重新进入“基础设置 → 展示样式”仍显示“可编辑表格”,并且列表进入可编辑状态。
172
-
173
- ## 常用搜索显示方式
174
-
175
- ```bash
176
- # PC 常用搜索显示为高级搜索;filter 表示筛选
177
- e10-cli --json form table-view search-style <objId> <appId> <listId> advanced
178
- ```
179
-
180
- 显示方式固定为 `advanced → commonSearchType="0"`、`filter → commonSearchType="1"`,不得直接猜内部值。
181
-
182
- 命令先确认 `listId` 属于目标表单,完整保留目标终端的其他配置,保存后重新读取目标属性;`--terminal` 同上(`pc` 只改 PC、`mobile` 只改移动端,另一端原样回传)。前端验收:“常用搜索 → 基础信息 → 显示方式”能正常打开,且刷新后仍为目标方式;若配置页异常,接口回读成功也不能验收。
183
-
184
- ## 常用搜索字段
185
-
186
- ```bash
187
- e10-cli --json form table-view search-field add <objId> <appId> <listId> <fieldId>
188
-
189
- # 按前端字段设置面板配置搜索项
190
- e10-cli --json form table-view search-field configure \
191
- <objId> <appId> <listId> <fieldId> \
192
- --display-name "单据名称" \
193
- --default-value "111" \
194
- --required 0 \
195
- --full-match 0 \
196
- --condition like
197
- ```
198
-
199
- 命令必须从当前数据源接口取得完整字段模型,按前端最终保存结构生成搜索项:字段 `id` 与独立的 18 位 `filterId` 不得混用,字段自身 `multiSelect` 原样保留,搜索默认配置单独写入 `listFilterDefaultSets`。保存时完整保留目标终端的其他配置,再独立回读字段及条件关系;`--terminal` 同上(`pc` 只改 PC、`mobile` 只改移动端,另一端原样回传)。
200
-
201
- 具体配置固定映射:
202
-
203
- - `--default-value`:固定默认值,写为 `defaultType="1"` 与 `startValue`;`--clear-default` 清除。`Select` 字段可传选项名称或选项 ID,CLI 必须从当前数据源解析为唯一真实 ID,并保留完整选项对象供前端回显。
204
- - `--required 0|1`:条件是否必填,写为字段级 `required`。
205
- - `--full-match 0|1`:搜索内容是否完整匹配,写入 `listFilterDefaultSets.searchContentFullMatches`。
206
- - `--condition like|eq|...`:必须来自该字段实际允许的条件,同时更新字段层与默认设置层。
207
- - `--display-name`:更新搜索项 `showName`;不得覆盖原字段名和字段 ID。
208
-
209
- 前端验收:打开“搜索配置”不报异常,目标字段出现在常用搜索字段中;刷新列表后可使用该字段发起搜索。只通过接口回读不能验收。
210
-
211
- ## 台账显示列/搜索/排序/统计/视图数据条件/行事件/分组/上下级/视图权限/分类搜索
212
-
213
- 直接改默认台账(nListView)的显示列、搜索条件、排序、顶部统计、视图数据条件。listId 取 `form list-view` 返回的列表视图 ID。默认改 PC 端;`list-columns --terminal mobile` 可改移动端显示列。**保存时先读回真实移动端 mConfig 原样回传,不会清空移动端**(`saveNListConfig` 一次请求里 `config`→PC 端、`mConfig`→移动端,两端列集合/uid 各自独立)。只有明确目标只使用 PC、移动端配置确实不存在时,才加 `--pc-only`。
214
-
215
- ```bash
216
- # 查看当前显示列
217
- e10-cli form list-columns <objId> <appId> <listId>
218
-
219
- # 批量追加字段到显示列 / 移除字段
220
- e10-cli form list-columns <objId> <appId> <listId> --add <fieldId1> <fieldId2>
221
- e10-cli form list-columns <objId> <appId> <listId> --remove <fieldId1> <fieldId2>
222
-
223
- # 按文件完整设置业务列顺序、宽度和格式(未列入的业务列会移除)
224
- e10-cli form list-columns <objId> <appId> <listId> --set @columns.json --json
225
- # 详见 references/form/guide-list-columns.md
226
-
227
- # 列显示格式:千分位/小数位(Number/Money 列,走列对象 format/decimalLength)
228
- e10-cli form list-format <objId> <appId> <listId> <fieldId> --thousandths --decimal 2
229
- e10-cli form list-format <objId> <appId> <listId> <fieldId> --no-thousandths
230
- # 列显示单位:后缀/前缀(走列 showTrans.ruleConfig,与千分位是两套机制)
231
- e10-cli form list-unit <objId> <appId> <listId> <fieldId> "(元)"
232
-
233
- # 配置搜索:--add 进搜索面板,--quick 加顶部快捷筛选(均支持多字段)
234
- e10-cli form list-search <objId> <appId> <listId> --add <fieldId1> <fieldId2>
235
- e10-cli form list-search <objId> <appId> <listId> --quick <fieldId1> <fieldId2>
236
- # 主表字段直接从 ds/fields 解析;明细子字段经 getFormField 单取元数据(ds/fields 合并不展开)
237
-
238
- # 配置排序 / 清除(--field 支持多个,按传入顺序多级排序;--order 对所有字段生效)
239
- e10-cli form list-sort <objId> <appId> <listId> --field <fieldId1> <fieldId2> --order ASC
240
- e10-cli form list-sort <objId> <appId> <listId> --clear
241
-
242
- # 主表/明细统计完整指南:references/form/guide-list-stats.md
243
- # 明细 count 支持只填 type/subFormId;批量入口:form list-stats detail
244
- # PC/MOBILE 可能共享统计项;以保存后的 mobileStatistics 为准,不能承诺只影响 PC
245
- # 顶部统计:type=sum 求和 / count 计数 / avg 平均 / max 最大 / min 最小
246
- # 可选:thousandths=true 千分位 / decimalPlaces="2" 小数位 / unit="万" 单位(unitType=tenThousand)
247
- e10-cli form list-stats <objId> <appId> <listId> --add '{"fieldId":"...","type":"sum","name":"合同总金额","thousandths":true,"decimalPlaces":"2","unit":"万"}'
248
-
249
- # 条件统计:conditions 数组构造明文条件树填 rootdata(发明文保存成功、读回也是明文,无需 LZW 编码)
250
- # func: eq 等于 / neq 不等于 / in 属于 / notIn 不属于 / like 包含 / notLike 不包含 / gt 大于 / lt 小于 / range 区间 / isNull 为空 / isNotNull 不为空
251
- # 单选 Select 用 eq;notEq/between 为兼容别名自动归一为 neq/range;range 的 value 用数组 [起,止];value 填选项 valueKey、text 填显示名;多条件默认 AND
252
- e10-cli form list-stats <objId> <appId> <listId> --add '{"fieldId":"金额fieldId","type":"sum","name":"研发合同额","thousandths":true,"unit":"万","conditions":[{"fieldId":"项目类型fieldId","func":"eq","value":"研发valueKey","text":"研发"}]}'
253
- e10-cli form list-stats <objId> <appId> <listId> --remove <statId> # 平台 statisticsList 是 upsert 语义,删除靠标 operation:DELETE(splice 不删)
254
-
255
- # 视图数据条件:台账只显示满足条件的数据(走 saveNListConfig config.filter,明文条件树,非独立接口——
256
- # conditionEditor/saveOrUpdate 表单级不挂视图、saveBaseinfo 带 conditionData 都是错误端点)
257
- # func 取值同条件统计(eq 等于 / neq 不等于 / in 属于 / notIn 不属于 / like 包含 / notLike 不包含 / gt 大于 / lt 小于 / range 区间 / isNull 为空 / isNotNull 不为空,单选 Select 用 eq);value 填选项 valueKey,text 填显示名
258
- # --add 是**叠加**(往现有条件上加);要整体覆盖用 --replace。--relation 设顶层关系(不给=沿用现有)
259
- e10-cli form list-filter <objId> <appId> <listId> --add '{"conditions":[{"fieldId":"项目类型fieldId","func":"eq","value":"研发valueKey","text":"研发"}]}'
260
- # 嵌套条件组:条目里有 conditions 数组就是一层组(带 relation),可任意嵌套 → A OR (B AND C)
261
- e10-cli form list-filter <objId> <appId> <listId> --replace '{"conditions":[{"fieldId":"Aid","func":"eq","value":"x"},{"relation":"and","conditions":[{"fieldId":"Bid","func":"eq","value":"y"},{"fieldId":"Cid","func":"gt","value":0}]}]}' --relation or
262
- e10-cli form list-filter <objId> <appId> <listId> --remove 项目类型fieldId # 按字段摘(该字段所有条件都摘;组摘空整组拿掉)
263
- e10-cli form list-filter <objId> <appId> <listId> --clear
264
- # 日期字段「等于」可用系统参数占位符(动态求值,原样存储):{date} / {date:+7} / {thisyear} / {curryear} 等
265
- # text 写界面显示名;占位符只用于 eq,且不要用 quick(quick 会展开成固定日期)。完整清单见 ref-list-filter-date-params.md
266
- e10-cli form list-filter <objId> <appId> <listId> --add '{"conditions":[{"fieldId":"日期字段id","func":"eq","value":"{curryear}","text":"本年"}]}'
267
-
268
- # 行事件:点击行数据 NewPage 打开(走 saveNListConfig config.eventGroup,明文 JSON,config+mConfig 都要写)
269
- # --add-page 选页面:pageId 缺省 "1/<objId>"(表单新建布局),"0/<objId>"=显示布局
270
- # 打开方式 openMode(linkInfo.openMode 权威,page.openMode 恒 4):
271
- # 当前页面=4 / 新窗口=0 / 弹出窗口=5 / 右侧滑出=1(缺省) / 右侧推出=7
272
- # 弹出/滑出/推出 带弹窗宽高(--modal-width/--modal-height,缺省 50%);滑出/推出 额外带 winSizeNew(--win-size,缺省 100%)
273
- # --add-field 选字段(URL取自行内字段值,urlFieldText/Type自动补)
274
- e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageName":"新建数据"}'
275
- e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageId":"0/<objId>","pageName":"显示布局","openMode":"当前页面"}'
276
- e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageName":"弹窗详情","openMode":"弹出窗口"}' --modal-width 80%
277
- e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageName":"侧滑详情","openMode":"右侧推出"}' --win-size 60%
278
- e10-cli form list-event <objId> <appId> <listId> --add-field '{"urlFieldId":"字段id"}'
279
- e10-cli form list-event <objId> <appId> <listId> --clear
280
-
281
- # 字段事件(列点击 list-click,区别于行事件 list-event):点某列数据打开该行显示布局(带数据 ID)
282
- # 打开方式 --open-mode:当前页面/新窗口/弹出窗口/右侧滑出(缺省)/右侧推出;滑出/推出 --win-size 设宽度(缺省 800px)。具体数值按需求填写:百分比使用 `%`(如 `45%`、`60%`),像素使用 `px`(如 `640px`、`900px`),两种单位不可混用或省略;百分比范围为 0%~100%。
283
- e10-cli form list-click <objId> <appId> <listId> <fieldId> --open-mode 右侧推出 --win-size 50%
284
- e10-cli form list-click <objId> <appId> <listId> <fieldId> --open-mode 右侧推出 --win-size 800px
285
- e10-cli form list-click <objId> <appId> <listId> <fieldId> --target <目标表单objId> --open-mode 弹出窗口
286
- e10-cli form list-click <objId> <appId> <listId> <fieldId> --clear
287
-
288
- # 启用分组:台账按某字段分组聚合显示(走 saveNListConfig config.enableGroup 对象 {enable,groupField,groupSize})
289
- # saveNListConfig 持久化成功,不走 designer/layout/save LZW。group-field 用完整字段对象(自动从 ds/fields 取)
290
- e10-cli form list-group <objId> <appId> <listId> --enable --group-field <分组字段fieldId> --group-size 100
291
- e10-cli form list-group <objId> <appId> <listId> --disable # 禁用但保留 groupField/groupSize(仅 enable=false)
292
-
293
- # 上下级树形展示:根据“上级类型”等自关联字段展示父子层级(走 config.superiorField)
294
- # parent-field 支持字段名称或 ID;必须是主表、单选、关联当前表单自身的 EBuilder 字段
295
- e10-cli form list-hierarchy <objId> <appId> <listId> --enable --parent-field "上级类型" --expand-level 2
296
- e10-cli form list-hierarchy <objId> <appId> <listId> --disable # 关闭但保留字段及展开设置
297
-
298
- # 台账视图权限(查阅/查看权限):谁能查看这个台账(走 list/permission/save + getList,专用端点,full-replace 语义 omit即删)
299
- # selectedType: all(所有人) / user(人员,带--name) / role(角色,--name 缺省自动查) / matrix(矩阵,用 --add-raw 传整对象)
300
- e10-cli form list-permission <objId> <appId> <listId> --add-all
301
- e10-cli form list-permission <objId> <appId> <listId> --add-user <userId> --name <人员名>
302
- e10-cli form list-permission <objId> <appId> <listId> --add-role <roleId> # --name 缺省自动从角色树查名
303
- e10-cli form list-permission <objId> <appId> <listId> --add-role <roleId> --share-level 2 # 加同一角色另一个共享级别
304
- e10-cli form list-permission <objId> <appId> <listId> --add-role <roleId> --seclevel 30-80 # 安全级别范围
305
- e10-cli form list-permission <objId> <appId> <listId> --add-raw '{"selectedType":"matrix","name":"...","dataid":"矩阵id",...}'
306
- e10-cli form list-permission <objId> <appId> <listId> --remove <权限id>
307
- e10-cli form list-permission <objId> <appId> <listId> --clear
308
-
309
- # 删除指定权限;清理重复“所有人”后保留唯一一条
310
- e10-cli form list-permission <objId> <appId> <listId> --remove <permissionId>
311
- e10-cli form list-permission <objId> <appId> <listId> --remove-all --add-all
312
-
313
- # 每条授权对象的两个可配维度(样本坐实,mulinquan 2026-09-02):
314
- # 安全级别 = levelScope.minShowlevel/maxShowlevel(字符串范围,--seclevel <min>-<max>,如 0-100 / 30-80;role 缺省 0-100、all 缺省空)
315
- # 共享级别 = roleLevel(验证: 总部=1 分部=2 全部=3)。同一角色可按不同共享级别各存一条(同 role 两条 roleLevel 1/2 并存)→ 去重键含 roleLevel
316
- # 幂等:目标(含 roleLevel)已存在时跳过保存,打印「无变化」
317
-
318
- # 分类搜索:台账左侧的分类筛选(走 saveNListConfig config.searchConditions.groupFilters)
319
- # 支持主表选项类、浏览框类、日期类与系统字段;不支持明细字段(产品边界)
320
- e10-cli form list-search-group <objId> <appId> <listId> --add <字段名或fieldId>
321
- e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --position 0 --option-order field
322
- e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --default-options "选项1,选项2" # 默认选中
323
- e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --options "选项1,选项3" # 只让这些选项出现
324
- e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --count-update # 统计数字随搜索结果更新
325
- e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --only-with-data # 仅显示有数据的选项
326
- e10-cli form list-search-group <objId> <appId> <listId> --add <日期字段> --date-granularity 月,季度 \
327
- --default-group month --default-value "2024-01-01 00:00:00,2024-12-31 23:59:59" # 日期类默认区间
328
- e10-cli form list-search-group <objId> <appId> <listId> --remove <fieldId>
329
- e10-cli form list-search-group <objId> <appId> <listId> --clear
330
- ```
331
-
332
- `--add` 对同一个字段**重建**那条分类搜索:本次没给的选项一律回到缺省(不勾默认值、全显示、不勾统计更新、不勾仅显示有数据),所以要改其中之一就把那条要保留的选项一起给全。
333
-
334
- 两个开关的适用范围不同,用错类型会当场报错而不是写一个界面上看不见的键:
335
-
336
- - `--count-update`(统计数字随搜索结果更新):选项 / 浏览框 / 日期类可用。缺省关,数字只在进入台账时统计一次。
337
- - `--only-with-data`(仅显示有数据的选项):**只有**选项 / 浏览框类有这个键,日期与系统字段用不了。这个键**勾上才出现** —— 不勾时整个键都没有(不会写成 0)。
338
- - `--no-show-count` 管的是**统计数字显不显示**,与 `--count-update` 是两回事。
339
-
340
- `list-hierarchy` 与 `list-group` 不可混为一谈:前者按自关联字段建立父子树,后者按普通字段聚合分组。需求出现“上下级”“父级”“树形”“根据上级类型展示”时使用 `list-hierarchy`。字段名不要求固定为“上级类型”,但字段关系必须满足自关联单选。
341
-
342
- 字段 ID 来自 `form read <objId> --app-id <appId>` 或 `form list-columns` 当前列(系统列如 `2`创建者/`3`创建时间也可增删;`5`数据ID主键自动保留,禁止移除)。显示列命令保存后回读校验,`otherTerminalPreserved:true` 表示另一终端配置核对一致。
343
-
344
- ## formView 固定闭环
345
-
346
- ```bash
347
- # 1. 确认目标表单与现有视图
348
- e10-cli form list <appId>
349
- e10-cli form view list <objId> <appId>
350
-
351
- # 2. 创建视图并从输出取得 viewId
352
- e10-cli --json form view create <objId> <appId> "<视图名>" --type formView
353
-
354
- # 3. 填充已有字段并独立回读
355
- e10-cli --json form view populate <objId> <appId> <viewId>
356
- ```
357
-
358
- `populate` 只有同时满足以下条件才算服务器验证通过:
359
-
360
- - `success=true`
361
- - `componentCount > 0`
362
- - `fieldComponentCount > 0`
363
- - 重复执行返回 `alreadyPopulated=true`
364
-
365
- 服务器验证通过后仍需用户确认前端不是空画布、字段名称和特殊配置正确。
366
-
367
- ## 执行与验收
368
-
369
- 1. 计划中写明表单 objId、视图名称、类型和终端;用户确认后再写入。
370
- 2. CLI 先调用 `createView`,再查询该表单的完整视图列表;创建响应本身不是验收。`formView` 随后调用 `populate`:`原 formId + viewId(layoutMultiId)` 读取目标布局,保留目标页面元数据,按目标布局类型重建已有字段组件并保存。
371
- 3. 回读以返回的 viewId 优先;服务端未返回 ID 时,才按名称、类型和终端唯一匹配。多个候选视图时停止并让用户确认。
372
- 4. `populate` 回读组件数量和字段 ID;用户再确认新视图设计页出现表单既有字段,而非只有“未分组”的空画布。
373
-
374
- 服务器成功和独立回读成功但尚未前端确认时,只能标记为“待前端确认”。
1
+ # 表单视图:新建与验收
2
+
3
+ 表单创建后已有默认台账;只有用户明确需要额外视图时才创建。表格视图是 `nListView` 数据列表,和普通 `formView` 是两条不同链路。
4
+
5
+ ## 需求判别
6
+
7
+ - “新建表单” → `form create --fields`。
8
+ - “客户信息表需要一个客户信息视图”等普通列表需求 → 先查询并复用该表单默认台账;“客户信息表”和“客户信息”的名称差异不构成额外新建理由。
9
+ - “在已有表单下明确新增一个额外表格视图” → `form table-view create`;命令必须同时保存显示列并回读。
10
+ - “在已有表单下新增表单视图” → `form view create --type formView`,随后必须 `form view populate`;不得新建另一张表单。
11
+
12
+ ## 默认台账复用
13
+
14
+ 1. 用 `form list-view <objId> <appId>` 查询已有列表,确认目标属于当前表单且用途符合需求,记录实际名称和 listId。存在多个候选时核对数据范围、权限和展示配置,不仅凭名称或第一条记录选择。
15
+ 2. 普通列表需求直接在该 listId 上配置显示列、筛选、排序、统计和事件;需要整组配置显示列时用 `form list-columns <objId> <appId> <listId> --set @columns.json`。`table-view ensure` 只用于空列补齐,不负责视图选择或重命名。
16
+ 3. 默认视图名称由平台随表单生成,不应机械沿用或统一去掉末尾“表”字。需求明确给出视图名称且与默认名称不一致时,使用 `form view rename` 修改已有视图并保留 ID;不要新建同用途视图代替改名。表单名、视图名和菜单名分别处理(表单名本身用 `form rename <objId> <appId> <新名称>` 改;它和视图名、菜单名互不影响)。例如表单“客户类型表”的视图要求为“客户类型”时,应把默认台账改名为“客户类型”,不能写成“同客户类型”。
17
+ 多出来的视图用 `form view delete` 删掉(**不可逆、无回收站**),命令会在删完回读确认确实没了。
18
+ 4. 只有明确需要“我的客户”“重点客户”等额外独立视图,或不同展示类型时,才进入新增流程。已有重复视图需先核对菜单、关联页签等引用及配置,不能自动删除。
19
+
20
+ 例如:已建“客户信息表”,方案中的“客户信息视图”可由其默认台账满足,plan 标记“复用默认台账”,填写实际 listId 即可。
21
+
22
+ ## 命令
23
+
24
+ ```bash
25
+ # 查询表单下全部视图
26
+ e10-cli form view list <objId> <appId>
27
+
28
+ # 修改已有默认台账名称(viewId 从上一条命令取得)
29
+ e10-cli form view rename <objId> <appId> <viewId> "客户类型"
30
+
31
+ # 创建可用表格视图;默认放入全部已有字段
32
+ e10-cli form table-view create <objId> <appId> "审批数据表格" --pc-only
33
+
34
+ # 创建看板视图(默认 PC + FLOW 布局)
35
+ e10-cli form view create <objId> <appId> "按状态看板" --type kanbanView
36
+
37
+ # 新增表单视图——流式布局(FLOW)
38
+ e10-cli form view create <objId> <appId> "新增-流式视图" --type formView --layout-type FLOW
39
+
40
+ # 新增表单视图——表格式布局(EXCEL)
41
+ e10-cli form view create <objId> <appId> "新增-EXCEL视图" --type formView --layout-type EXCEL
42
+
43
+ # 第 2 步:把已有字段按目标布局类型填入新建 formView(流式/EXCEL 各自生成对应组件)
44
+ e10-cli form view populate <objId> <appId> <viewId>
45
+
46
+ # 创建移动端日历视图
47
+ e10-cli form view create <objId> <appId> "交付日历" \
48
+ --type calendarView --terminal MOBILE --layout-type FLOW
49
+ ```
50
+
51
+ **给已有表单加表单视图是两步闭环**(缺一不可):
52
+ 1. `form view create --type formView --layout-type FLOW|EXCEL` —— 建一个**空**的 formView 实体,`--layout-type` 决定流式(FLOW)还是表格式(EXCEL)。同一张表单可同时存在多个 formView,布局类型可不同(如一张表既加流式视图又加 EXCEL 视图)。
53
+ 2. `form view populate <objId> <appId> <viewId>` —— 把已有字段按目标布局类型填进去。流式视图生成流式组件、EXCEL 视图生成表格定位,**不得把 EXCEL 定位直接复制到 FLOW 视图**。
54
+
55
+ `form view populate` 以原表单 `formId` 读取字段,以新视图 `viewId` 作为 `layoutMultiId` 读取目标布局,再按目标的 FLOW/EXCEL 类型重新生成字段组件并独立回读。不得把视图的 `versionId` 或 `pageLayoutId` 当成 `formId`。
56
+
57
+ **视图里已经有字段时,`populate` 是「只补缺」**:只把后来新增、视图里还没有的字段补进去,
58
+ **已有组件的排版与属性一个不动**(重跑幂等,已齐就只回一句「已有完整字段布局」)。
59
+ 所以「表单加了字段、要让它出现在某个视图里」也走这条 —— 不必删视图重建。
60
+
61
+ 字段的**物理表归属**会一并带进组件:表单在「字段管理 → 其他」里加过附属物理表(一张表单多张物理表)时,
62
+ 字段列表会把各张物理表的字段一起返回,`populate` 按每个字段自己的物理表归属写入组件,
63
+ 附属表的字段在视图里挂对表、不会被平台按主表校验拒掉
64
+ (被拒的报错就是 `此字段不属于当前物理表,不能更改位置`)。
65
+
66
+ ## 复制 / 设默认 / 删除一套布局
67
+
68
+ 设计器里视图卡片右键的三个动作,各有对应命令(都在 `form layout` 组下,不是 `form view`):
69
+
70
+ ```bash
71
+ # 复制(复制出来的不是默认布局)
72
+ e10-cli form layout copy <objId> <appId> --from <源布局ID> [--name <新名>]
73
+
74
+ # 设为默认
75
+ e10-cli form layout set-default <objId> <appId> <布局ID> [--for all|add|view|edit]
76
+
77
+ # 删除(⚠ 不可逆)
78
+ e10-cli form layout delete <objId> <appId> <布局ID>
79
+ ```
80
+
81
+ - **复制**:`--from` 传的是**视图 ID**(`form view list` 能查到)。平台**不回新布局 ID**,
82
+ 命令靠自己复制前后各读一次列表反查,报出来的 `layoutId=` 就是新的那套。`--name` 缺省沿用源布局名。
83
+ - **设默认的 `--for` 是「用途档位」,不是 FLOW/EXCEL 那个布局类型**:`all` 全部布局 /
84
+ `add` 新建布局 / `view` 显示布局 / `edit` 编辑布局,缺省 `all`(也收中文说法)。
85
+ **一套布局同时只承担一个档位** —— 把同一套从 `add` 改成 `view`,`add` 就没了;
86
+ 「新建用一套、显示用另一套」是靠**三套不同布局各占一档**。只有 `all` 会让视图的 `default` 变 `true`。
87
+ - **删除**:`layoutId` 传视图 ID。删完**回读确认列表里确实没了**才算成功(平台会「返回成功但没删掉」)。
88
+ 这套布局原先占着某个档位的话,命令会一并打出来。⚠ **不可逆**;删掉正占着 `all` 的那套会怎样**未验证**,慎用。
89
+
90
+ 看板、日历、思维导图目前只确认创建实体和视图列表回读,尚不能据此宣称设计器已有可用组件。
91
+
92
+ 普通 `form view create --type` 只接受:
93
+
94
+ - `formView`:详情视图
95
+ - `kanbanView`:看板视图
96
+ - `calendarView`:日历视图
97
+ - `mindMapView`:思维导图视图
98
+ - `multiView`:多维表格视图(无 layoutType/terminalType,带 `extConfig:{listVersion:5}`)。**数据维度**:缺省主表(`subFormId:""/subFormMain:false`);明细表维度用 `--detail <明细名>`(按名解析明细 subFormId)或 `--sub-form-id <明细subFormId>`(直传),传值即 `subFormId:<明细subFormId>/subFormMain:true`。明细子表名/subFormId 用 `dataset/v1/getFields` detailFields 查(真 subFormId 在 `fields[].subFormId`,非 `dt.id`)。**多维表格显示列**复用台账同一套 `saveNListConfig/getNListConfig`,直接用 `form list-columns <objId> <appId> <multiView的viewId> --add <fieldId>` 加列。
99
+
100
+ `tableView`/`nListView` 不得传给普通视图命令。真实表格视图固定使用 `form table-view create`。
101
+
102
+ ## 额外表格视图新建闭环
103
+
104
+ ```bash
105
+ # 1. 已确认需要额外独立视图,再查询目标表单和已有列表
106
+ e10-cli form list <appId>
107
+ e10-cli form list-view <objId> <appId>
108
+
109
+ # 2. 创建 nListView、写入全部业务显示列和隐藏数据主键、独立回读
110
+ e10-cli --json form table-view create <objId> <appId> "<表格视图名>" --pc-only
111
+
112
+ # 3. 再次独立查询表单下列表
113
+ e10-cli --json form list-view <objId> <appId>
114
+ ```
115
+
116
+ 命令先用 `viewType=nListView` 创建,再以新 `listId` 读取 PC 配置;业务列必须取自 `/api/ebuilder/common/ds/fields` 的完整字段对象,不能只拼字段 ID。保存时保留服务端配置和隐藏主键 `id=5`,最后回读 `tableField` 和列表实体。命令只拦截完全同名的视图,不识别简称或业务用途;执行前必须完成复用判断,不能因名称未完全匹配就新建。已有同名视图时停止,不盲目重建。
117
+
118
+ `--pc-only` 只用于已确认本次验收为 PC 的场景。未指定时,命令必须取得真实 MOBILE 配置,禁止用 PC 配置推导移动端。
119
+
120
+ `create` / `ensure` 同样支持 `--terminal pc|mobile`(缺省 `pc`):决定显示列写进哪一端,另一端原样保留。只给某一端配显示列时用 `--terminal`,两端都要就分两次执行。
121
+
122
+ ```bash
123
+ # 只给移动端补显示列,PC 端配置不动
124
+ e10-cli --json form table-view create <objId> <appId> "移动端表格" --terminal mobile
125
+ ```
126
+
127
+ 服务器通过必须同时满足:
128
+
129
+ - 创建后按返回 `listId` 找到同名列表。
130
+ - `persisted=true`。
131
+ - `visibleFieldCount` 等于目标业务字段数。
132
+ - `tableFieldCount` 还包含隐藏主键。
133
+ - 再查 `form list-view` 仍能按相同 ID 和名称找到。
134
+
135
+ 前端无数据时可以没有数据行,但必须看见业务字段列头;否则仍是空壳,不能验收。
136
+
137
+ ## 表格视图展示样式
138
+
139
+ ```bash
140
+ e10-cli --json form table-view style <objId> <appId> <listId> <style>
141
+ ```
142
+
143
+ `style` 使用前台语义,不直接让使用者猜内部 `mode`:
144
+
145
+ | style | 前台展示样式 | mode |
146
+ |---|---|---|
147
+ | `table` | 表格式 | `1` |
148
+ | `list` | 列表式 | `2` |
149
+ | `left-diagram` | 左图式 | `3` |
150
+ | `horizontal-list` | 横向列表式 | `4` |
151
+ | `above` | 上图式 | `5` |
152
+ | `grid` | 网格列表式 | `7` |
153
+ | `editable` | 可编辑表格(编辑态) | `11` |
154
+
155
+ 可编辑表格内部还有数据态 `8` 和只读态 `9`;用户要求“改成可编辑表格”时必须使用编辑态 `11`,不得把只读态 `9` 当成完成。
156
+
157
+ 命令先确认 `listId` 属于目标 `objId`,读取目标终端的完整配置后只修改其顶层 `mode`,保存后重新读取该终端配置核对。
158
+
159
+ PC 与移动端是**两个独立槽位**(保存接口的 `config` 落 PC、`mConfig` 落移动端),`--terminal` 决定改哪一端,缺省 `pc`:
160
+
161
+ - `--terminal pc`:只改 PC,移动端配置原样回传;
162
+ - `--terminal mobile`:只改移动端,PC 配置原样回传。
163
+
164
+ 末尾会回显实际落点与另一端状态(`终端: 移动端(另一端配置保持原样)`)。另一端配置读取不到时,只有明确 `--pc-only` 才允许继续;`--terminal mobile` 与 `--pc-only` 互斥,同时传会直接报错——不要用 `--pc-only` 去改移动端。
165
+
166
+ ```bash
167
+ # 只把移动端改成网格列表式,PC 展示样式保持不动
168
+ e10-cli --json form table-view style <objId> <appId> <listId> grid --terminal mobile
169
+ ```
170
+
171
+ 前端验收:重新进入“基础设置 → 展示样式”仍显示“可编辑表格”,并且列表进入可编辑状态。
172
+
173
+ ## 常用搜索显示方式
174
+
175
+ ```bash
176
+ # PC 常用搜索显示为高级搜索;filter 表示筛选
177
+ e10-cli --json form table-view search-style <objId> <appId> <listId> advanced
178
+ ```
179
+
180
+ 显示方式固定为 `advanced → commonSearchType="0"`、`filter → commonSearchType="1"`,不得直接猜内部值。
181
+
182
+ 命令先确认 `listId` 属于目标表单,完整保留目标终端的其他配置,保存后重新读取目标属性;`--terminal` 同上(`pc` 只改 PC、`mobile` 只改移动端,另一端原样回传)。前端验收:“常用搜索 → 基础信息 → 显示方式”能正常打开,且刷新后仍为目标方式;若配置页异常,接口回读成功也不能验收。
183
+
184
+ ## 常用搜索字段
185
+
186
+ ```bash
187
+ e10-cli --json form table-view search-field add <objId> <appId> <listId> <fieldId>
188
+
189
+ # 按前端字段设置面板配置搜索项
190
+ e10-cli --json form table-view search-field configure \
191
+ <objId> <appId> <listId> <fieldId> \
192
+ --display-name "单据名称" \
193
+ --default-value "111" \
194
+ --required 0 \
195
+ --full-match 0 \
196
+ --condition like
197
+ ```
198
+
199
+ 命令必须从当前数据源接口取得完整字段模型,按前端最终保存结构生成搜索项:字段 `id` 与独立的 18 位 `filterId` 不得混用,字段自身 `multiSelect` 原样保留,搜索默认配置单独写入 `listFilterDefaultSets`。保存时完整保留目标终端的其他配置,再独立回读字段及条件关系;`--terminal` 同上(`pc` 只改 PC、`mobile` 只改移动端,另一端原样回传)。
200
+
201
+ 具体配置固定映射:
202
+
203
+ - `--default-value`:固定默认值,写为 `defaultType="1"` 与 `startValue`;`--clear-default` 清除。`Select` 字段可传选项名称或选项 ID,CLI 必须从当前数据源解析为唯一真实 ID,并保留完整选项对象供前端回显。
204
+ - `--required 0|1`:条件是否必填,写为字段级 `required`。
205
+ - `--full-match 0|1`:搜索内容是否完整匹配,写入 `listFilterDefaultSets.searchContentFullMatches`。
206
+ - `--condition like|eq|...`:必须来自该字段实际允许的条件,同时更新字段层与默认设置层。
207
+ - `--display-name`:更新搜索项 `showName`;不得覆盖原字段名和字段 ID。
208
+
209
+ 前端验收:打开“搜索配置”不报异常,目标字段出现在常用搜索字段中;刷新列表后可使用该字段发起搜索。只通过接口回读不能验收。
210
+
211
+ ## 台账显示列/搜索/排序/统计/视图数据条件/行事件/分组/上下级/视图权限/分类搜索
212
+
213
+ 直接改默认台账(nListView)的显示列、搜索条件、排序、顶部统计、视图数据条件。listId 取 `form list-view` 返回的列表视图 ID。默认改 PC 端;`list-columns --terminal mobile` 可改移动端显示列。**保存时先读回真实移动端 mConfig 原样回传,不会清空移动端**(`saveNListConfig` 一次请求里 `config`→PC 端、`mConfig`→移动端,两端列集合/uid 各自独立)。只有明确目标只使用 PC、移动端配置确实不存在时,才加 `--pc-only`。
214
+
215
+ ```bash
216
+ # 查看当前显示列
217
+ e10-cli form list-columns <objId> <appId> <listId>
218
+
219
+ # 批量追加字段到显示列 / 移除字段
220
+ e10-cli form list-columns <objId> <appId> <listId> --add <fieldId1> <fieldId2>
221
+ e10-cli form list-columns <objId> <appId> <listId> --remove <fieldId1> <fieldId2>
222
+
223
+ # 按文件完整设置业务列顺序、宽度和格式(未列入的业务列会移除)
224
+ e10-cli form list-columns <objId> <appId> <listId> --set @columns.json --json
225
+ # 详见 references/form/guide-list-columns.md
226
+
227
+ # 列显示格式:千分位/小数位(Number/Money 列,走列对象 format/decimalLength)
228
+ e10-cli form list-format <objId> <appId> <listId> <fieldId> --thousandths --decimal 2
229
+ e10-cli form list-format <objId> <appId> <listId> <fieldId> --no-thousandths
230
+ # 列显示单位:后缀/前缀(走列 showTrans.ruleConfig,与千分位是两套机制)
231
+ e10-cli form list-unit <objId> <appId> <listId> <fieldId> "(元)"
232
+
233
+ # 配置搜索:--add 进搜索面板,--quick 加顶部快捷筛选(均支持多字段)
234
+ e10-cli form list-search <objId> <appId> <listId> --add <fieldId1> <fieldId2>
235
+ e10-cli form list-search <objId> <appId> <listId> --quick <fieldId1> <fieldId2>
236
+ # 主表字段直接从 ds/fields 解析;明细子字段经 getFormField 单取元数据(ds/fields 合并不展开)
237
+
238
+ # 配置排序 / 清除(--field 支持多个,按传入顺序多级排序;--order 对所有字段生效)
239
+ e10-cli form list-sort <objId> <appId> <listId> --field <fieldId1> <fieldId2> --order ASC
240
+ e10-cli form list-sort <objId> <appId> <listId> --clear
241
+
242
+ # 主表/明细统计完整指南:references/form/guide-list-stats.md
243
+ # 明细 count 支持只填 type/subFormId;批量入口:form list-stats detail
244
+ # PC/MOBILE 可能共享统计项;以保存后的 mobileStatistics 为准,不能承诺只影响 PC
245
+ # 顶部统计:type=sum 求和 / count 计数 / avg 平均 / max 最大 / min 最小
246
+ # 可选:thousandths=true 千分位 / decimalPlaces="2" 小数位 / unit="万" 单位(unitType=tenThousand)
247
+ e10-cli form list-stats <objId> <appId> <listId> --add '{"fieldId":"...","type":"sum","name":"合同总金额","thousandths":true,"decimalPlaces":"2","unit":"万"}'
248
+
249
+ # 条件统计:conditions 数组构造明文条件树填 rootdata(发明文保存成功、读回也是明文,无需 LZW 编码)
250
+ # func: eq 等于 / neq 不等于 / in 属于 / notIn 不属于 / like 包含 / notLike 不包含 / gt 大于 / lt 小于 / range 区间 / isNull 为空 / isNotNull 不为空
251
+ # 单选 Select 用 eq;notEq/between 为兼容别名自动归一为 neq/range;range 的 value 用数组 [起,止];value 填选项 valueKey、text 填显示名;多条件默认 AND
252
+ e10-cli form list-stats <objId> <appId> <listId> --add '{"fieldId":"金额fieldId","type":"sum","name":"研发合同额","thousandths":true,"unit":"万","conditions":[{"fieldId":"项目类型fieldId","func":"eq","value":"研发valueKey","text":"研发"}]}'
253
+ e10-cli form list-stats <objId> <appId> <listId> --remove <statId> # 平台 statisticsList 是 upsert 语义,删除靠标 operation:DELETE(splice 不删)
254
+
255
+ # 视图数据条件:台账只显示满足条件的数据(走 saveNListConfig config.filter,明文条件树,非独立接口——
256
+ # conditionEditor/saveOrUpdate 表单级不挂视图、saveBaseinfo 带 conditionData 都是错误端点)
257
+ # func 取值同条件统计(eq 等于 / neq 不等于 / in 属于 / notIn 不属于 / like 包含 / notLike 不包含 / gt 大于 / lt 小于 / range 区间 / isNull 为空 / isNotNull 不为空,单选 Select 用 eq);value 填选项 valueKey,text 填显示名
258
+ # --add 是**叠加**(往现有条件上加);要整体覆盖用 --replace。--relation 设顶层关系(不给=沿用现有)
259
+ e10-cli form list-filter <objId> <appId> <listId> --add '{"conditions":[{"fieldId":"项目类型fieldId","func":"eq","value":"研发valueKey","text":"研发"}]}'
260
+ # 嵌套条件组:条目里有 conditions 数组就是一层组(带 relation),可任意嵌套 → A OR (B AND C)
261
+ e10-cli form list-filter <objId> <appId> <listId> --replace '{"conditions":[{"fieldId":"Aid","func":"eq","value":"x"},{"relation":"and","conditions":[{"fieldId":"Bid","func":"eq","value":"y"},{"fieldId":"Cid","func":"gt","value":0}]}]}' --relation or
262
+ e10-cli form list-filter <objId> <appId> <listId> --remove 项目类型fieldId # 按字段摘(该字段所有条件都摘;组摘空整组拿掉)
263
+ e10-cli form list-filter <objId> <appId> <listId> --clear
264
+ # 日期字段「等于」可用系统参数占位符(动态求值,原样存储):{date} / {date:+7} / {thisyear} / {curryear} 等
265
+ # text 写界面显示名;占位符只用于 eq,且不要用 quick(quick 会展开成固定日期)。完整清单见 ref-list-filter-date-params.md
266
+ e10-cli form list-filter <objId> <appId> <listId> --add '{"conditions":[{"fieldId":"日期字段id","func":"eq","value":"{curryear}","text":"本年"}]}'
267
+
268
+ # 行事件:点击行数据 NewPage 打开(走 saveNListConfig config.eventGroup,明文 JSON,config+mConfig 都要写)
269
+ # --add-page 选页面:pageId 缺省 "1/<objId>"(表单新建布局),"0/<objId>"=显示布局
270
+ # 打开方式 openMode(linkInfo.openMode 权威,page.openMode 恒 4):
271
+ # 当前页面=4 / 新窗口=0 / 弹出窗口=5 / 右侧滑出=1(缺省) / 右侧推出=7
272
+ # 弹出/滑出/推出 带弹窗宽高(--modal-width/--modal-height,缺省 50%);滑出/推出 额外带 winSizeNew(--win-size,缺省 100%)
273
+ # --add-field 选字段(URL取自行内字段值,urlFieldText/Type自动补)
274
+ e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageName":"新建数据"}'
275
+ e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageId":"0/<objId>","pageName":"显示布局","openMode":"当前页面"}'
276
+ e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageName":"弹窗详情","openMode":"弹出窗口"}' --modal-width 80%
277
+ e10-cli form list-event <objId> <appId> <listId> --add-page '{"pageName":"侧滑详情","openMode":"右侧推出"}' --win-size 60%
278
+ e10-cli form list-event <objId> <appId> <listId> --add-field '{"urlFieldId":"字段id"}'
279
+ e10-cli form list-event <objId> <appId> <listId> --clear
280
+
281
+ # 字段事件(列点击 list-click,区别于行事件 list-event):点某列数据打开该行显示布局(带数据 ID)
282
+ # 打开方式 --open-mode:当前页面/新窗口/弹出窗口/右侧滑出(缺省)/右侧推出;滑出/推出 --win-size 设宽度(缺省 800px)。具体数值按需求填写:百分比使用 `%`(如 `45%`、`60%`),像素使用 `px`(如 `640px`、`900px`),两种单位不可混用或省略;百分比范围为 0%~100%。
283
+ e10-cli form list-click <objId> <appId> <listId> <fieldId> --open-mode 右侧推出 --win-size 50%
284
+ e10-cli form list-click <objId> <appId> <listId> <fieldId> --open-mode 右侧推出 --win-size 800px
285
+ e10-cli form list-click <objId> <appId> <listId> <fieldId> --target <目标表单objId> --open-mode 弹出窗口
286
+ e10-cli form list-click <objId> <appId> <listId> <fieldId> --clear
287
+
288
+ # 启用分组:台账按某字段分组聚合显示(走 saveNListConfig config.enableGroup 对象 {enable,groupField,groupSize})
289
+ # saveNListConfig 持久化成功,不走 designer/layout/save LZW。group-field 用完整字段对象(自动从 ds/fields 取)
290
+ e10-cli form list-group <objId> <appId> <listId> --enable --group-field <分组字段fieldId> --group-size 100
291
+ e10-cli form list-group <objId> <appId> <listId> --disable # 禁用但保留 groupField/groupSize(仅 enable=false)
292
+
293
+ # 上下级树形展示:根据“上级类型”等自关联字段展示父子层级(走 config.superiorField)
294
+ # parent-field 支持字段名称或 ID;必须是主表、单选、关联当前表单自身的 EBuilder 字段
295
+ e10-cli form list-hierarchy <objId> <appId> <listId> --enable --parent-field "上级类型" --expand-level 2
296
+ e10-cli form list-hierarchy <objId> <appId> <listId> --disable # 关闭但保留字段及展开设置
297
+
298
+ # 台账视图权限(查阅/查看权限):谁能查看这个台账(走 list/permission/save + getList,专用端点,full-replace 语义 omit即删)
299
+ # selectedType: all(所有人) / user(人员,带--name) / role(角色,--name 缺省自动查) / matrix(矩阵,用 --add-raw 传整对象)
300
+ e10-cli form list-permission <objId> <appId> <listId> --add-all
301
+ e10-cli form list-permission <objId> <appId> <listId> --add-user <userId> --name <人员名>
302
+ e10-cli form list-permission <objId> <appId> <listId> --add-role <roleId> # --name 缺省自动从角色树查名
303
+ e10-cli form list-permission <objId> <appId> <listId> --add-role <roleId> --share-level 2 # 加同一角色另一个共享级别
304
+ e10-cli form list-permission <objId> <appId> <listId> --add-role <roleId> --seclevel 30-80 # 安全级别范围
305
+ e10-cli form list-permission <objId> <appId> <listId> --add-raw '{"selectedType":"matrix","name":"...","dataid":"矩阵id",...}'
306
+ e10-cli form list-permission <objId> <appId> <listId> --remove <权限id>
307
+ e10-cli form list-permission <objId> <appId> <listId> --clear
308
+
309
+ # 删除指定权限;清理重复“所有人”后保留唯一一条
310
+ e10-cli form list-permission <objId> <appId> <listId> --remove <permissionId>
311
+ e10-cli form list-permission <objId> <appId> <listId> --remove-all --add-all
312
+
313
+ # 每条授权对象的两个可配维度(样本坐实,mulinquan 2026-09-02):
314
+ # 安全级别 = levelScope.minShowlevel/maxShowlevel(字符串范围,--seclevel <min>-<max>,如 0-100 / 30-80;role 缺省 0-100、all 缺省空)
315
+ # 共享级别 = roleLevel(验证: 总部=1 分部=2 全部=3)。同一角色可按不同共享级别各存一条(同 role 两条 roleLevel 1/2 并存)→ 去重键含 roleLevel
316
+ # 幂等:目标(含 roleLevel)已存在时跳过保存,打印「无变化」
317
+
318
+ # 分类搜索:台账左侧的分类筛选(走 saveNListConfig config.searchConditions.groupFilters)
319
+ # 支持主表选项类、浏览框类、日期类与系统字段;不支持明细字段(产品边界)
320
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段名或fieldId>
321
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --position 0 --option-order field
322
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --default-options "选项1,选项2" # 默认选中
323
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --options "选项1,选项3" # 只让这些选项出现
324
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --count-update # 统计数字随搜索结果更新
325
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --only-with-data # 仅显示有数据的选项
326
+ e10-cli form list-search-group <objId> <appId> <listId> --add <日期字段> --date-granularity 月,季度 \
327
+ --default-group month --default-value "2024-01-01 00:00:00,2024-12-31 23:59:59" # 日期类默认区间
328
+ e10-cli form list-search-group <objId> <appId> <listId> --remove <fieldId>
329
+ e10-cli form list-search-group <objId> <appId> <listId> --clear
330
+
331
+ # 自定义分类(GroupCustom):名称、显示方式、显示封存的选项
332
+ e10-cli form list-search-group <objId> <appId> <listId> --add-custom "客户分类" --display 平铺 --show-archive on
333
+ e10-cli form list-search-group <objId> <appId> <listId> --add-custom "客户分类" --display 下拉 --show-archive off # 同名=更新,保留原 id
334
+ e10-cli form list-search-group <objId> <appId> <listId> --remove "客户分类" # 也可传 id / fieldId
335
+ ```
336
+
337
+ `--add` 对同一个字段**重建**那条分类搜索:本次没给的选项一律回到缺省(不勾默认值、全显示、不勾统计更新、不勾仅显示有数据),所以要改其中之一就把那条要保留的选项一起给全。
338
+
339
+ **自定义分类**(`--add-custom`)是平台的 `GroupCustom` 类型:没有创建接口,id 由前端生成 18 位数字、`fieldId = GroupCustom_<id>`;分类值(`listGroupSets`)初始为空,之后在设计器里配置,CLI 只负责建分类壳并设置名称/显示方式/封存。同名再执行是更新而不是新增。
340
+
341
+ - `--display 平铺|下拉`:分类搜索的「显示方式」,落 `tabStyle`(`平铺="tab"`、`下拉="select"`,缺省下拉)。
342
+ - `--show-archive on|off`:落 `showArchiveOption`(`"1"`/`"0"`,缺省开)。界面上这个开关**只对选项类字段(CheckBox/Select/RadioBox/SelectMultiple)显示**,自定义分类看不到它,但报文里该键仍会写入。
343
+ - `--position 0|1`:0=顶部(缺省)、1=左侧 / 下拉样式(平台枚举 Top="0"、Left/DropDown="1")。
344
+
345
+ ### 搜索中的自定义分类
346
+
347
+ 常用搜索与分类搜索都可添加独立的自定义分类。它们分别保存在两套搜索配置中,即使名称相同也是两条不同配置;分别执行命令,不复用另一处的 ID。把配置保存为 JSON 文件,使用 `--custom @文件` 新建或按 `id`/唯一名称更新。`options` 是自定义分类的选项,不是字段原有选项;更新时应列出希望保留的全部选项,已有同名选项的 ID、条件和默认选中状态会沿用。
348
+
349
+ ```json
350
+ {
351
+ "name": "分类1",
352
+ "selection": "single",
353
+ "required": true,
354
+ "showArchiveOption": false,
355
+ "options": [
356
+ {
357
+ "name": "指定时间内由我创建",
358
+ "conditions": [
359
+ { "fieldId": "3", "func": "range", "value": ["2026-10-01 08:00:00", "2026-11-14 18:00:00"] },
360
+ { "fieldId": "2", "func": "eq", "value": "{userid}", "text": "当前人员" }
361
+ ],
362
+ "relation": "and"
363
+ },
364
+ { "name": "我关注的", "systemOption": "myFollow", "default": true }
365
+ ]
366
+ }
367
+ ```
368
+
369
+ ```bash
370
+ # 常用搜索中的自定义分类:可设必填、单选/多选、默认项及每项条件
371
+ e10-cli form list-search <objId> <appId> <listId> --custom @custom-search.json --archive off
372
+
373
+ # 分类搜索中的自定义分类:同一份配置可复用,但会生成独立分类与选项 ID
374
+ e10-cli form list-search-group <objId> <appId> <listId> --custom @custom-search.json --archive off
375
+
376
+ # 普通字段的封存选项也可关闭
377
+ e10-cli form list-search <objId> <appId> <listId> --field <fieldId> --archive off
378
+ e10-cli form list-search-group <objId> <appId> <listId> --add <字段> --archive off
379
+ ```
380
+
381
+ `showArchiveOption: false` 或 `--archive off` 保存为 `"0"`,开启为 `"1"`;显式命令参数优先于文件。`selection` 为 `single` 或 `multiple`,`required` 仅用于常用搜索。每个普通自定义选项用与 `list-filter` 相同的 `conditions` 条件数组(可嵌套条件组),也可用 `conditionData` 传已有的完整条件树;常用搜索选项必须有条件或系统选项。当前确认可用的系统选项是 `myFollow`(我关注的),其他系统选项须先核对平台配置。分类搜索可只配置选项名称;若需按条件筛选,应给该选项配置 `conditions` 或 `conditionData`。保存后分别读取 `list-search --json` 或 `list-search-group --json`,再在实际视图核对展示与筛选结果。
382
+
383
+ 两个开关的适用范围不同,用错类型会当场报错而不是写一个界面上看不见的键:
384
+
385
+ - `--count-update`(统计数字随搜索结果更新):选项 / 浏览框 / 日期类可用。缺省关,数字只在进入台账时统计一次。
386
+ - `--only-with-data`(仅显示有数据的选项):**只有**选项 / 浏览框类有这个键,日期与系统字段用不了。这个键**勾上才出现** —— 不勾时整个键都没有(不会写成 0)。
387
+ - `--no-show-count` 管的是**统计数字显不显示**,与 `--count-update` 是两回事。
388
+
389
+ `list-hierarchy` 与 `list-group` 不可混为一谈:前者按自关联字段建立父子树,后者按普通字段聚合分组。需求出现“上下级”“父级”“树形”“根据上级类型展示”时使用 `list-hierarchy`。字段名不要求固定为“上级类型”,但字段关系必须满足自关联单选。
390
+
391
+ 字段 ID 来自 `form read <objId> --app-id <appId>` 或 `form list-columns` 当前列(系统列如 `2`创建者/`3`创建时间也可增删;`5`数据ID主键自动保留,禁止移除)。显示列命令保存后回读校验,`otherTerminalPreserved:true` 表示另一终端配置核对一致。
392
+
393
+ ## formView 固定闭环
394
+
395
+ ```bash
396
+ # 1. 确认目标表单与现有视图
397
+ e10-cli form list <appId>
398
+ e10-cli form view list <objId> <appId>
399
+
400
+ # 2. 创建视图并从输出取得 viewId
401
+ e10-cli --json form view create <objId> <appId> "<视图名>" --type formView
402
+
403
+ # 3. 填充已有字段并独立回读
404
+ e10-cli --json form view populate <objId> <appId> <viewId>
405
+ ```
406
+
407
+ `populate` 只有同时满足以下条件才算服务器验证通过:
408
+
409
+ - `success=true`
410
+ - `componentCount > 0`
411
+ - `fieldComponentCount > 0`
412
+ - 重复执行返回 `alreadyPopulated=true`
413
+
414
+ 服务器验证通过后仍需用户确认前端不是空画布、字段名称和特殊配置正确。
415
+
416
+ ## 执行与验收
417
+
418
+ 1. 计划中写明表单 objId、视图名称、类型和终端;用户确认后再写入。
419
+ 2. CLI 先调用 `createView`,再查询该表单的完整视图列表;创建响应本身不是验收。`formView` 随后调用 `populate`:`原 formId + viewId(layoutMultiId)` 读取目标布局,保留目标页面元数据,按目标布局类型重建已有字段组件并保存。
420
+ 3. 回读以返回的 viewId 优先;服务端未返回 ID 时,才按名称、类型和终端唯一匹配。多个候选视图时停止并让用户确认。
421
+ 4. `populate` 回读组件数量和字段 ID;用户再确认新视图设计页出现表单既有字段,而非只有“未分组”的空画布。
422
+
423
+ 服务器成功和独立回读成功但尚未前端确认时,只能标记为“待前端确认”。