weaver-e10-builder 1.0.12-beta → 1.1.1

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 (217) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +17 -3
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/auth.d.ts.map +1 -1
  5. package/dist/commands/auth.js +3 -0
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/form-association-manage.d.ts +3 -0
  8. package/dist/commands/form-association-manage.d.ts.map +1 -0
  9. package/dist/commands/form-association-manage.js +76 -0
  10. package/dist/commands/form-association-manage.js.map +1 -0
  11. package/dist/commands/form-association.d.ts.map +1 -1
  12. package/dist/commands/form-association.js +29 -25
  13. package/dist/commands/form-association.js.map +1 -1
  14. package/dist/commands/form-button.d.ts.map +1 -1
  15. package/dist/commands/form-button.js +71 -159
  16. package/dist/commands/form-button.js.map +1 -1
  17. package/dist/commands/form-field-linkage.d.ts +3 -0
  18. package/dist/commands/form-field-linkage.d.ts.map +1 -0
  19. package/dist/commands/form-field-linkage.js +300 -0
  20. package/dist/commands/form-field-linkage.js.map +1 -0
  21. package/dist/commands/form-list-columns.d.ts +3 -0
  22. package/dist/commands/form-list-columns.d.ts.map +1 -0
  23. package/dist/commands/form-list-columns.js +50 -0
  24. package/dist/commands/form-list-columns.js.map +1 -0
  25. package/dist/commands/form-list-stats.d.ts +0 -8
  26. package/dist/commands/form-list-stats.d.ts.map +1 -1
  27. package/dist/commands/form-list-stats.js +41 -133
  28. package/dist/commands/form-list-stats.js.map +1 -1
  29. package/dist/commands/form-list.d.ts.map +1 -1
  30. package/dist/commands/form-list.js +2 -126
  31. package/dist/commands/form-list.js.map +1 -1
  32. package/dist/commands/form.d.ts.map +1 -1
  33. package/dist/commands/form.js +116 -2
  34. package/dist/commands/form.js.map +1 -1
  35. package/dist/commands/interface.d.ts +3 -0
  36. package/dist/commands/interface.d.ts.map +1 -0
  37. package/dist/commands/interface.js +51 -0
  38. package/dist/commands/interface.js.map +1 -0
  39. package/dist/commands/menu-permission.d.ts.map +1 -1
  40. package/dist/commands/menu-permission.js +133 -82
  41. package/dist/commands/menu-permission.js.map +1 -1
  42. package/dist/commands/skill.js +2 -2
  43. package/dist/commands/skill.js.map +1 -1
  44. package/dist/commands/update.d.ts +13 -0
  45. package/dist/commands/update.d.ts.map +1 -0
  46. package/dist/commands/update.js +101 -0
  47. package/dist/commands/update.js.map +1 -0
  48. package/dist/commands/workflow-node-empty-handle.d.ts +13 -0
  49. package/dist/commands/workflow-node-empty-handle.d.ts.map +1 -0
  50. package/dist/commands/workflow-node-empty-handle.js +137 -0
  51. package/dist/commands/workflow-node-empty-handle.js.map +1 -0
  52. package/dist/commands/workflow.d.ts.map +1 -1
  53. package/dist/commands/workflow.js +90 -18
  54. package/dist/commands/workflow.js.map +1 -1
  55. package/dist/index.js +8 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/postinstall.d.ts +2 -0
  58. package/dist/postinstall.d.ts.map +1 -0
  59. package/dist/postinstall.js +17 -0
  60. package/dist/postinstall.js.map +1 -0
  61. package/dist/services/actionflow/command_output.d.ts +4 -0
  62. package/dist/services/actionflow/command_output.d.ts.map +1 -1
  63. package/dist/services/actionflow/command_output.js +44 -0
  64. package/dist/services/actionflow/command_output.js.map +1 -1
  65. package/dist/services/actionflow/component_registry.d.ts.map +1 -1
  66. package/dist/services/actionflow/component_registry.js +5 -1
  67. package/dist/services/actionflow/component_registry.js.map +1 -1
  68. package/dist/services/actionflow/components/action_eb_add.js +1 -1
  69. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  70. package/dist/services/actionflow/components/approve_trigger.d.ts +5 -0
  71. package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
  72. package/dist/services/actionflow/components/approve_trigger.js +22 -1
  73. package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
  74. package/dist/services/actionflow/components/approve_trigger_compiler.js +2 -2
  75. package/dist/services/actionflow/components/approve_trigger_compiler.js.map +1 -1
  76. package/dist/services/actionflow/components/custom_trigger.d.ts +9 -0
  77. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -0
  78. package/dist/services/actionflow/components/custom_trigger.js +47 -0
  79. package/dist/services/actionflow/components/custom_trigger.js.map +1 -0
  80. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  81. package/dist/services/actionflow/components/enquiry_form.js +29 -3
  82. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  83. package/dist/services/actionflow/components/event_button.d.ts +3 -0
  84. package/dist/services/actionflow/components/event_button.d.ts.map +1 -0
  85. package/dist/services/actionflow/components/event_button.js +32 -0
  86. package/dist/services/actionflow/components/event_button.js.map +1 -0
  87. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  88. package/dist/services/actionflow/components/index.js +10 -0
  89. package/dist/services/actionflow/components/index.js.map +1 -1
  90. package/dist/services/actionflow/components/inner_mq_listener.d.ts +3 -0
  91. package/dist/services/actionflow/components/inner_mq_listener.d.ts.map +1 -0
  92. package/dist/services/actionflow/components/inner_mq_listener.js +40 -0
  93. package/dist/services/actionflow/components/inner_mq_listener.js.map +1 -0
  94. package/dist/services/actionflow/components/inner_mq_send.d.ts +5 -0
  95. package/dist/services/actionflow/components/inner_mq_send.d.ts.map +1 -0
  96. package/dist/services/actionflow/components/inner_mq_send.js +72 -0
  97. package/dist/services/actionflow/components/inner_mq_send.js.map +1 -0
  98. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  99. package/dist/services/actionflow/components/send_message.js +7 -4
  100. package/dist/services/actionflow/components/send_message.js.map +1 -1
  101. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  102. package/dist/services/actionflow/context_preflight.js +7 -1
  103. package/dist/services/actionflow/context_preflight.js.map +1 -1
  104. package/dist/services/actionflow/design_client.d.ts +13 -2
  105. package/dist/services/actionflow/design_client.d.ts.map +1 -1
  106. package/dist/services/actionflow/design_client.js +56 -8
  107. package/dist/services/actionflow/design_client.js.map +1 -1
  108. package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
  109. package/dist/services/actionflow/enrich_approve_trigger.js +31 -0
  110. package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
  111. package/dist/services/actionflow/form_source.d.ts +2 -0
  112. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  113. package/dist/services/actionflow/form_source.js +5 -0
  114. package/dist/services/actionflow/form_source.js.map +1 -1
  115. package/dist/services/actionflow/formula_service.d.ts +1 -1
  116. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  117. package/dist/services/actionflow/formula_service.js +118 -12
  118. package/dist/services/actionflow/formula_service.js.map +1 -1
  119. package/dist/services/actionflow/functions_catalog.d.ts +2 -1
  120. package/dist/services/actionflow/functions_catalog.d.ts.map +1 -1
  121. package/dist/services/actionflow/functions_catalog.js +2392 -180
  122. package/dist/services/actionflow/functions_catalog.js.map +1 -1
  123. package/dist/services/actionflow/functions_source.d.ts.map +1 -1
  124. package/dist/services/actionflow/functions_source.js +3 -0
  125. package/dist/services/actionflow/functions_source.js.map +1 -1
  126. package/dist/services/actionflow/generation_service.d.ts +11 -0
  127. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  128. package/dist/services/actionflow/generation_service.js +66 -23
  129. package/dist/services/actionflow/generation_service.js.map +1 -1
  130. package/dist/services/actionflow/plan_constraints.d.ts +5 -0
  131. package/dist/services/actionflow/plan_constraints.d.ts.map +1 -0
  132. package/dist/services/actionflow/plan_constraints.js +54 -0
  133. package/dist/services/actionflow/plan_constraints.js.map +1 -0
  134. package/dist/services/actionflow/preflight_service.d.ts +3 -0
  135. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  136. package/dist/services/actionflow/preflight_service.js +152 -8
  137. package/dist/services/actionflow/preflight_service.js.map +1 -1
  138. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  139. package/dist/services/actionflow/readback_verifier.js +63 -2
  140. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  141. package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
  142. package/dist/services/actionflow/save_workflow_draft.js +43 -2
  143. package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
  144. package/dist/services/actionflow/update_service.d.ts +41 -0
  145. package/dist/services/actionflow/update_service.d.ts.map +1 -0
  146. package/dist/services/actionflow/update_service.js +767 -0
  147. package/dist/services/actionflow/update_service.js.map +1 -0
  148. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  149. package/dist/services/actionflow/workflow_compiler.js +120 -12
  150. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  151. package/dist/services/esb-interface/document-parser.d.ts +6 -0
  152. package/dist/services/esb-interface/document-parser.d.ts.map +1 -0
  153. package/dist/services/esb-interface/document-parser.js +247 -0
  154. package/dist/services/esb-interface/document-parser.js.map +1 -0
  155. package/dist/services/esb-interface/importer.d.ts +9 -0
  156. package/dist/services/esb-interface/importer.d.ts.map +1 -0
  157. package/dist/services/esb-interface/importer.js +44 -0
  158. package/dist/services/esb-interface/importer.js.map +1 -0
  159. package/dist/services/esb-interface/postman-collection.d.ts +9 -0
  160. package/dist/services/esb-interface/postman-collection.d.ts.map +1 -0
  161. package/dist/services/esb-interface/postman-collection.js +125 -0
  162. package/dist/services/esb-interface/postman-collection.js.map +1 -0
  163. package/dist/services/esb-interface/types.d.ts +91 -0
  164. package/dist/services/esb-interface/types.d.ts.map +1 -0
  165. package/dist/services/esb-interface/types.js +2 -0
  166. package/dist/services/esb-interface/types.js.map +1 -0
  167. package/dist/services/form-association.d.ts +49 -0
  168. package/dist/services/form-association.d.ts.map +1 -0
  169. package/dist/services/form-association.js +279 -0
  170. package/dist/services/form-association.js.map +1 -0
  171. package/dist/services/form-button-position.d.ts +35 -0
  172. package/dist/services/form-button-position.d.ts.map +1 -0
  173. package/dist/services/form-button-position.js +109 -0
  174. package/dist/services/form-button-position.js.map +1 -0
  175. package/dist/services/form-list-columns.d.ts +54 -0
  176. package/dist/services/form-list-columns.d.ts.map +1 -0
  177. package/dist/services/form-list-columns.js +236 -0
  178. package/dist/services/form-list-columns.js.map +1 -0
  179. package/dist/services/form-list-stats.d.ts +44 -0
  180. package/dist/services/form-list-stats.d.ts.map +1 -0
  181. package/dist/services/form-list-stats.js +302 -0
  182. package/dist/services/form-list-stats.js.map +1 -0
  183. package/dist/services/skill-provision.d.ts +6 -1
  184. package/dist/services/skill-provision.d.ts.map +1 -1
  185. package/dist/services/skill-provision.js +12 -2
  186. package/dist/services/skill-provision.js.map +1 -1
  187. package/dist/services/update-check.d.ts +24 -0
  188. package/dist/services/update-check.d.ts.map +1 -0
  189. package/dist/services/update-check.js +108 -0
  190. package/dist/services/update-check.js.map +1 -0
  191. package/package.json +2 -1
  192. package/skill-docs/SKILL.md +29 -107
  193. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +61 -39
  194. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +23 -21
  195. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +23 -21
  196. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +101 -75
  197. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +33 -0
  198. package/skill-docs/actionflows/references/components/logic/Condition.md +23 -23
  199. package/skill-docs/actionflows/references/components/message/InnerMQSend.md +40 -0
  200. package/skill-docs/actionflows/references/components/message/SendMessage.md +2 -2
  201. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +45 -0
  202. package/skill-docs/actionflows/references/components/trigger/InnerMQListener.md +40 -0
  203. package/skill-docs/actionflows/references/components/workflow/ApproveTrigger.md +35 -0
  204. package/skill-docs/actionflows/references/condition_rules.md +4 -2
  205. package/skill-docs/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1043 -1046
  206. package/skill-docs/actionflows/references/trigger_runtime_notes.md +53 -51
  207. package/skill-docs/references/common/guide-plan-template.md +201 -0
  208. package/skill-docs/references/common/ref-cli-commands.md +45 -11
  209. package/skill-docs/references/form/guide-create-form.md +4 -2
  210. package/skill-docs/references/form/guide-field-linkage.md +121 -0
  211. package/skill-docs/references/form/guide-form-association.md +108 -0
  212. package/skill-docs/references/form/guide-form-button.md +54 -0
  213. package/skill-docs/references/form/guide-form-view.md +26 -9
  214. package/skill-docs/references/form/guide-list-columns.md +52 -0
  215. package/skill-docs/references/form/guide-list-stats.md +83 -0
  216. package/skill-docs/references/workflow/guide-workflow-action.md +172 -168
  217. package/skill-docs/references/workflow/guide-workflow.md +16 -2
@@ -0,0 +1,121 @@
1
+ # 字段联动(跨表带出赋值)指南
2
+
3
+ ## 概述
4
+
5
+ 字段联动(FormDataLinkage):表单字段值改变时,自动查询**另一张表**(按数据ID=触发字段值过滤),把查到的字段值**带出赋值**到本表单字段。支持单跳(一次直接带出)和多跳链式(多次中转后带出)。
6
+
7
+ 背后是一个 ESB FieldLinkage 动作流(触发 + N 个 EnquiryForm 查询 + Output 赋值),CLI 自动完成建 ESB app + saveDesign + 绑定。
8
+
9
+ ## 三种联动对比
10
+
11
+ | | 属性联动(显隐) | 关联表带出(form relate) | **字段联动(field-linkage)** |
12
+ |---|---|---|---|
13
+ | 命令 | `form linkage add` | `form relate` | `form field-linkage add` |
14
+ | 接口 | viewlinkage | ffRelateField module:hrm | saveFormDataLinkage + saveDesign(ESB) |
15
+ | 作用 | 改字段显示属性(hide/show/required) | 换 Employee/Department→带 HRM 属性 | **查任意表→带出任意字段赋值** |
16
+ | 源 | 表单字段值条件 | Employee/Department(HRM 源) | 任意字段→任意表查询 |
17
+ | 复杂度 | 简单 | 简单(单源单属性) | 复杂(跨表多跳,ESB 动作流) |
18
+ | 关系 | — | — | **字段联动是关联表带出的进阶版** |
19
+
20
+ ## 何时用多跳
21
+
22
+ **Text 字段赋值必须用名称(多跳),不能直接赋 ID。**
23
+
24
+ | 场景 | 跳数 | 示例 |
25
+ |------|------|------|
26
+ | 带出字段是 EBuilder(存 ID)→ 目标也是 EBuilder | 单跳 | 关联合同→查合同信息表→带出关联客户(ID→EBuilder 字段) |
27
+ | 带出字段存 ID → 目标是 Text(要名称) | **多跳** | 关联客户→查客户信息表→客户类型(ID)→查客户类型表→类型名称(Text)→填 Text 字段 |
28
+
29
+ **判断原则**:目标字段是 EBuilder/Select(存 ID)→ 单跳即可;目标字段是 Text(要展示名称)→ 必须多跳到名称表取名称。
30
+
31
+ ## CLI 命令
32
+
33
+ ```bash
34
+ # 列出
35
+ e10-cli form field-linkage list <appId> <objId>
36
+
37
+ # 回读单条
38
+ e10-cli form field-linkage read <appId> <objId> <linkageId>
39
+
40
+ # 查源表可带出字段
41
+ e10-cli form field-linkage fields <appId> <formId>
42
+
43
+ # 删除(批量)
44
+ e10-cli form field-linkage delete <appId> <objId> <linkageId...>
45
+ ```
46
+
47
+ ### 新增(add)
48
+
49
+ **单跳**(一次直接带出):
50
+ ```bash
51
+ e10-cli form field-linkage add <appId> <objId> \
52
+ --trigger <触发字段名> \
53
+ --source-form <目标表objId> \
54
+ --query-field <目标表带出字段名> \
55
+ --target <本表目标字段名>
56
+ ```
57
+
58
+ **多跳**(多次中转后带出):
59
+ ```bash
60
+ e10-cli form field-linkage add <appId> <objId> \
61
+ --trigger <触发字段名> \
62
+ --target <本表目标字段名> \
63
+ --hops "<源表objId:带出字段名,源表objId:带出字段名,...>"
64
+ ```
65
+
66
+ `--hops` 格式:每跳 `objId:字段名`,逗号分隔。前一跳的带出值 = 下一跳的过滤值(数据ID=前一跳结果)。最后一跳的带出值赋给 `--target`。
67
+
68
+ ## 配置示例
69
+
70
+ ### 示例1:单跳——关联合同→合同信息表→关联客户
71
+
72
+ ```
73
+ 关联合同(EBuilder→合同信息表) 值改变
74
+ → 查合同信息表 by 数据ID=关联合同
75
+ → 带出关联客户(EBuilder→客户信息表,存ID)
76
+ → 赋值到本表.关联客户(EBuilder字段,存ID)
77
+ ```
78
+
79
+ ```bash
80
+ e10-cli form field-linkage add <appId> <objId> \
81
+ --trigger 关联合同 --source-form <合同信息表objId> --query-field 关联客户 --target 关联客户
82
+ ```
83
+
84
+ ### 示例2:多跳——关联客户→客户信息表→客户类型→客户类型表→类型名称→填Text
85
+
86
+ ```
87
+ 关联客户(EBuilder→客户信息表) 值改变
88
+ → Step1: 查客户信息表 by 数据ID=关联客户 → 带出客户类型(EBuilder→客户类型表,存ID)
89
+ → Step2: 查客户类型表 by 数据ID=客户类型(Step1结果) → 带出类型名称(Text)
90
+ → 赋值到本表.客户类型(Text字段,要名称不要ID)
91
+ ```
92
+
93
+ ```bash
94
+ e10-cli form field-linkage add <appId> <objId> \
95
+ --trigger 关联客户 --target 客户类型 \
96
+ --hops "<客户信息表objId>:客户类型,<客户类型表objId>:类型名称"
97
+ ```
98
+
99
+ ### 示例3:链式联动(两条独立 linkage 串联)
100
+
101
+ 关联合同→(linkage1)→关联客户→(linkage2)→客户类型→(linkage3)→类型名称
102
+
103
+ 每条 linkage 的 `--trigger` 是上一条的 `--target`。分开 `add` 多次即可。
104
+
105
+ ## 查源表字段
106
+
107
+ ```bash
108
+ # 查某表单有哪些可带出字段
109
+ e10-cli form field-linkage fields <appId> <formId>
110
+ ```
111
+
112
+ 或用 `e10-cli form read <objId> --app-id <appId>` 取字段 fieldId(配置 --hops 时需知道字段名)。
113
+
114
+ ## 注意事项
115
+
116
+ 1. **Text 字段必须多跳取名称**:目标字段是 Text → 带出值必须是名称(文本),不能是 ID。如果源表存的是 ID(EBuilder/Select),需多跳到名称表取名称。
117
+ 2. **orgId 必须正确**:CLI 自动从 getForm 取 orgId,传给 application/save 建 ESB app。没有 orgId 的 app 不完整,saveDesign 会 500。
118
+ 3. **多跳 EnquiryForm 需要 sources**:非首跳的查询动作必须有 `sources` 指向前一跳,否则服务器报"有两个起始执行组件"(CLI 已处理)。
119
+ 4. **FormData 引用格式**:触发字段 `FormData.<本表formId>.<触发字段id>`;查询结果 `FormData.<源表objId>[].field_<带出字段id>`。
120
+ 5. **--hops 的 objId 是表单 objId**(不是 formId)。CLI 内部自动解析 objId→formId。
121
+ 6. **联动名称**:不传 `--name` 时自动生成 `<本表名>.<触发字段>→<最后源表名>.<最后带出字段>`。
@@ -0,0 +1,108 @@
1
+ # 关联页签:目标视图、显示布局与数据筛选
2
+
3
+ 在来源表单的记录页面上新增关联页签,打开已有目标视图,并将当前记录字段作为筛选参数传入。例如:客户信息表 → “全部合同”页签 → 合同信息表的“全部合同”视图。
4
+
5
+ ## 配置前查询
6
+
7
+ ```bash
8
+ e10-cli form association list <objId> <appId>
9
+ e10-cli form association views <objId> <appId>
10
+ e10-cli form association fields <objId> <appId> --view <viewId>
11
+ e10-cli --json form association get <objId> <appId> <associationId>
12
+ ```
13
+
14
+ - `objId` 是放置页签的来源表单,不是目标视图所属表单。
15
+ - `views` 返回目标视图 ID、名称、所属表单。名称重复时必须传 ID。
16
+ - `fields` 分别返回来源字段 `source` 与目标字段 `target`。不要把两端字段 ID 混用。
17
+ - 跨应用通过 `--target-app <appId>` 显式选择,命令验证目标应用菜单树和视图实际归属。
18
+ - `get --json` 的正确写法是全局 `--json`(如上),保留原始权限配置,并额外提供解析后的权限条件 `rules`。
19
+
20
+ ## 创建关联页签
21
+
22
+ ```bash
23
+ e10-cli form association create <objId> <appId> "全部合同" --view <viewId> --layouts 显示 --terminals PC MOBILE --permissions @association-permissions.json --mappings @association-mappings.json
24
+ ```
25
+
26
+ 创建时必须明确权限。方案要求所有人可见时,`association-permissions.json` 可写:
27
+
28
+ ```json
29
+ [
30
+ {
31
+ "selectedType": "all",
32
+ "dataid": "0",
33
+ "levelScope": {"minShowlevel": "", "maxShowlevel": ""},
34
+ "condition": {"rootdata": ""}
35
+ }
36
+ ]
37
+ ```
38
+
39
+ 不要在方案没有要求时默认采用所有人权限。其他组织、角色等权限按平台实际配置提供完整数组;本命令不推断权限对象。
40
+
41
+ 筛选映射文件格式:
42
+
43
+ ```json
44
+ [
45
+ {"targetField": "关联客户", "sourceField": "客户名称"}
46
+ ]
47
+ ```
48
+
49
+ 每项含义为“目标视图字段 ← 当前来源记录字段”。支持字段 ID 或唯一显示名称,自动补全 `compType/fieldName/dataIndex` 等元数据。仅支持主表字段到主表字段的映射;明细字段及固定值筛选不在本次支持范围。
50
+
51
+ 上例复现抓包中的配置,不代表所有关联字段都应传名称。目标 EBuilder 字段可能需要记录 ID:应按业务语义选择 `sourceField: "数据ID"` 或指定字段,并用实际记录确认筛选结果。命令不会擅自把用户提供的名称字段改成 ID。
52
+
53
+ 默认启用,默认适用于 PC 和 MOBILE,默认仅显示布局。省略 `--mappings` 表示不添加关联参数;目标视图自身的筛选仍独立生效。创建检测同名页签,重复时停止,改用 `update`。
54
+
55
+ ## 显示布局与其他设置
56
+
57
+ | 参数 | 含义 |
58
+ |---|---|
59
+ | `--layouts 显示` | `showLayout="0"`:打开显示布局,关闭编辑布局 |
60
+ | `--layouts 编辑` | `showLayout="2"`:仅编辑布局 |
61
+ | `--layouts 显示 编辑` | `showLayout="0,2"`:两种布局都显示 |
62
+ | `--layouts none` | 两种布局均不显示 |
63
+ | `--terminals PC MOBILE` | 两端适用;可只传其中一个 |
64
+ | `--enabled true/false` | 启用或停用页签 |
65
+
66
+ ```bash
67
+ e10-cli form association update <objId> <appId> <associationId> --layouts 显示
68
+ e10-cli form association update <objId> <appId> <associationId> --name "相关合同" --terminals PC --enabled true
69
+ e10-cli form association update <objId> <appId> <associationId> --view <newViewId> --mappings @association-mappings.json
70
+ ```
71
+
72
+ `update` 保留未指定属性以及原动作、权限条件和提示。布局、终端参数表示替换对应集合。修改绑定视图且已有映射时必须显式提供新映射(`[]` 可清空),避免原目标表字段被用于新视图。
73
+
74
+ ## 修改和清空关联数据筛选
75
+
76
+ ```bash
77
+ e10-cli form association set-filter <objId> <appId> <associationId> --mappings @association-mappings.json
78
+ e10-cli form association clear-filter <objId> <appId> <associationId>
79
+ ```
80
+
81
+ 设置会替换目标动作的全部筛选映射。存在多个视图动作时,用 `--action <actionId>` 明确选择;只修改该动作,其余动作保留。
82
+
83
+ 这里处理的是 `associationActions[].url` 内的 `params`(`nameType/type=FORMFIELDS`),不会修改目标视图的全局过滤,也不会修改页签的权限条件。
84
+
85
+ ## 权限条件是另一项能力
86
+
87
+ ```bash
88
+ e10-cli form association set-condition <objId> <appId> <associationId> --perm 1 --rules @permission-rules.json --logic or
89
+ e10-cli form association clear-condition <objId> <appId> <associationId> --perm 1
90
+ ```
91
+
92
+ 这两条操作 `associationPermissions[].condition.rootdata`,规则格式为 `[{"fieldId":"...","func":"contains","value":"..."}]`。`--perm` 为 1 开始的序号或 `selectedType`;支持 `and/or`。此条件按来源表单字段生成,与“目标视图数据筛选映射”分别配置。
93
+
94
+ 平台权限条件读回是明文 JSON,写入需 LZW 压缩。更新布局或数据筛选时也会重新压缩原有权限条件;不要自行传入压缩字符串。
95
+
96
+ ## 验证与计划
97
+
98
+ 保存后回读目标视图、筛选映射、显示布局、终端、动作和权限相关配置,成功输出 `verified: true`。创建响应可能不带顶层 ID,命令通过列表差集和详情确定新关联 ID。若提示已提交但无法匹配,先 `list/get`,不要直接再次创建。
99
+
100
+ 配置回读不等于验证了浏览器展示或实际筛选结果。验收还应打开来源记录的显示/编辑布局,检查页签显示范围,并用已知关联与非关联记录检查目标视图结果。
101
+
102
+ 在计划模板 3.3 中逐项填写:
103
+
104
+ - 关联页签:来源表单/objId、页签名称/associationId、目标应用/表单/视图 ID、权限依据。
105
+ - 布局与终端:显示布局是否开启、编辑布局是否开启、PC/MOBILE、启用状态。
106
+ - 数据筛选:每条目标字段 ← 来源字段,注明传记录 ID 还是字段值,以及配置回读和实际结果验收情况。
107
+
108
+ 先创建目标视图,再创建依赖它的关联页签;关联 ID、视图 ID、动作 ID 不能互换。未验证的项保留待办,不预先打勾。
@@ -0,0 +1,54 @@
1
+ # 台账视图按钮显示位置
2
+
3
+ 用于将已有系统按钮或自定义按钮显示在指定视图的行上、行末下拉或顶部。配置的是按钮 `showPosition`,与整行点击的 `form list-event`、字段点击的 `form list-click` 独立。
4
+
5
+ ## 查询与设置
6
+
7
+ ```bash
8
+ e10-cli form button list <objId> <appId>
9
+ e10-cli form button views <objId> <appId> <buttonId>
10
+ e10-cli form button position <objId> <appId> <buttonId> --view <listId> --position 行上
11
+ ```
12
+
13
+ `views` 返回平台 `getViewDatas` 对此按钮开放的视图,以及现有位置配置。`--view` 支持视图 ID、唯一名称、表单页语义“新建/编辑/显示”;多个同名视图必须用 ID。省略视图或使用“台账”时,必须只有一个可选台账,否则拒绝保存。
14
+
15
+ | 显示位置 | 平台值 |
16
+ |---|---|
17
+ | 右上 | `rightTop` |
18
+ | 右上下拉 | `rightTopDropDown` |
19
+ | 行上(行内) | `lineEnd` |
20
+ | 行末下拉 | `LineEndDropDown` |
21
+
22
+ 行上、行末下拉只适用于台账,不适用于表单新建/编辑/显示页。
23
+
24
+ ## 多视图及替换语义
25
+
26
+ 普通设置默认合并:仅更新指定视图,保留其余台账及表单页的位置。同一视图的旧位置数组由此次指定的位置数组替换;需要多位置时一次传齐。
27
+
28
+ ```bash
29
+ e10-cli form button position <objId> <appId> <buttonId> --view <listId> --position 行上 右上
30
+ e10-cli form button position <objId> <appId> <buttonId> --show-position @button-positions.json
31
+ ```
32
+
33
+ 不同视图使用不同位置时,JSON 文件示例(将 ID 占位替换为实际值):
34
+
35
+ ```json
36
+ {
37
+ "<listIdA>_table": ["lineEnd"],
38
+ "<listIdB>_table": ["LineEndDropDown"],
39
+ "show_form": ["rightTop"],
40
+ "edit_form": ["rightTopDropDown"]
41
+ }
42
+ ```
43
+
44
+ `--show-position` 也默认合并,不能与 `--position/--view` 同时使用。显式 `--replace` 才替换全部页面配置;未列出的页面不再显示该按钮。`--show-position '{}' --replace` 清空所有显示位置。
45
+
46
+ 新建自定义按钮也支持 `form button add ... --view <listId> --position 行上`。按钮点击动作仍由原有动作配置决定;改变显示位置不会自动添加行数据参数。
47
+
48
+ ## 保存与验证
49
+
50
+ 命令先分页查找按钮,再读取动作、权限和可选视图。提交时保留按钮基础配置、完整动作和权限,及接口返回的日志/自定义提示设置,并按视图实际名称重建 `showPositionSpan`。
51
+
52
+ 保存后回读按钮位置并核对动作、权限 ID 集合;成功输出 `verified: true`。若提示“已保存,但回读不一致”,远端可能已修改,必须先重新查询再处理。该验证属于配置回读,不代表已验证按钮点击行为或浏览器渲染。
53
+
54
+ 计划模板 3.3 中必须记录:按钮名称/ID、目标视图名称/ID、显示位置、验证结果。只有需求涉及按钮展示时才填写,无需求标“— 无”。系统删除按钮测试仅核对配置和显示,不点击删除业务数据。
@@ -5,9 +5,19 @@
5
5
  ## 需求判别
6
6
 
7
7
  - “新建表单” → `form create --fields`。
8
- - “在已有表单下新增表格视图” → `form table-view create`;命令必须同时保存显示列并回读。
8
+ - “客户信息表需要一个客户信息视图”等普通列表需求 → 先查询并复用该表单默认台账;“客户信息表”和“客户信息”的名称差异不构成额外新建理由。
9
+ - “在已有表单下明确新增一个额外表格视图” → `form table-view create`;命令必须同时保存显示列并回读。
9
10
  - “在已有表单下新增表单视图” → `form view create --type formView`,随后必须 `form view populate`;不得新建另一张表单。
10
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. 默认保留平台生成的名称,不统一去掉末尾“表”字。用户明确要求名称对齐时应改已有视图名称并保留 ID;目前 CLI 未提供视图重命名命令,不能用新建同用途视图代替改名。表单名、视图名和菜单名分别处理。
17
+ 4. 只有明确需要“我的客户”“重点客户”等额外独立视图,或不同展示类型时,才进入新增流程。已有重复视图需先核对菜单、关联页签等引用及配置,不能自动删除。
18
+
19
+ 例如:已建“客户信息表”,方案中的“客户信息视图”可由其默认台账满足,plan 标记“复用默认台账”,填写实际 listId 即可。
20
+
11
21
  ## 命令
12
22
 
13
23
  ```bash
@@ -52,10 +62,10 @@ e10-cli form view create <objId> <appId> "交付日历" \
52
62
 
53
63
  `tableView`/`nListView` 不得传给普通视图命令。真实表格视图固定使用 `form table-view create`。
54
64
 
55
- ## 表格视图固定闭环
65
+ ## 额外表格视图新建闭环
56
66
 
57
67
  ```bash
58
- # 1. 确认目标表单和同名列表不存在
68
+ # 1. 已确认需要额外独立视图,再查询目标表单和已有列表
59
69
  e10-cli form list <appId>
60
70
  e10-cli form list-view <objId> <appId>
61
71
 
@@ -66,7 +76,7 @@ e10-cli --json form table-view create <objId> <appId> "<表格视图名>" --pc-o
66
76
  e10-cli --json form list-view <objId> <appId>
67
77
  ```
68
78
 
69
- 命令先用 `viewType=nListView` 创建,再以新 `listId` 读取 PC 配置;业务列必须取自 `/api/ebuilder/common/ds/fields` 的完整字段对象,不能只拼字段 ID。保存时保留服务端配置和隐藏主键 `id=5`,最后回读 `tableField` 和列表实体。已有同名视图时停止,不盲目重建。
79
+ 命令先用 `viewType=nListView` 创建,再以新 `listId` 读取 PC 配置;业务列必须取自 `/api/ebuilder/common/ds/fields` 的完整字段对象,不能只拼字段 ID。保存时保留服务端配置和隐藏主键 `id=5`,最后回读 `tableField` 和列表实体。命令只拦截完全同名的视图,不识别简称或业务用途;执行前必须完成复用判断,不能因名称未完全匹配就新建。已有同名视图时停止,不盲目重建。
70
80
 
71
81
  `--pc-only` 只用于已确认本次验收为 PC 的场景。未指定时,命令必须取得真实 MOBILE 配置,禁止用 PC 配置推导移动端。
72
82
 
@@ -144,15 +154,19 @@ e10-cli --json form table-view search-field configure \
144
154
 
145
155
  ## 台账显示列/搜索/排序/统计/视图数据条件/行事件/启用分组/视图权限/分类搜索(list-columns / list-search / list-sort / list-stats / list-filter / list-event / list-group / list-permission / list-search-group)
146
156
 
147
- 直接改默认台账(nListView)的显示列、搜索条件、排序、顶部统计、视图数据条件。listId 取 `form list-view` 返回的列表视图 ID。这些命令都只改 PC 端,**保存时先读回真实移动端 mConfig 原样回传,不会清空移动端**(`saveNListConfig` 一次请求里 `config`→PC 端、`mConfig`→移动端,两端列集合/uid 各自独立)。只有明确目标只使用 PC、移动端配置确实不存在时,才加 `--pc-only`。
157
+ 直接改默认台账(nListView)的显示列、搜索条件、排序、顶部统计、视图数据条件。listId 取 `form list-view` 返回的列表视图 ID。默认改 PC 端;`list-columns --terminal mobile` 可改移动端显示列。**保存时先读回真实移动端 mConfig 原样回传,不会清空移动端**(`saveNListConfig` 一次请求里 `config`→PC 端、`mConfig`→移动端,两端列集合/uid 各自独立)。只有明确目标只使用 PC、移动端配置确实不存在时,才加 `--pc-only`。
148
158
 
149
159
  ```bash
150
160
  # 查看当前显示列
151
161
  e10-cli form list-columns <objId> <appId> <listId>
152
162
 
153
- # 追加字段到显示列 / 移除字段
154
- e10-cli form list-columns <objId> <appId> <listId> --add <fieldId>
155
- e10-cli form list-columns <objId> <appId> <listId> --remove <fieldId>
163
+ # 批量追加字段到显示列 / 移除字段
164
+ e10-cli form list-columns <objId> <appId> <listId> --add <fieldId1> <fieldId2>
165
+ e10-cli form list-columns <objId> <appId> <listId> --remove <fieldId1> <fieldId2>
166
+
167
+ # 按文件完整设置业务列顺序、宽度和格式(未列入的业务列会移除)
168
+ e10-cli form list-columns <objId> <appId> <listId> --set @columns.json --json
169
+ # 详见 references/form/guide-list-columns.md
156
170
 
157
171
  # 列显示格式:千分位/小数位(Number/Money 列,走列对象 format/decimalLength)
158
172
  e10-cli form list-format <objId> <appId> <listId> <fieldId> --thousandths --decimal 2
@@ -169,6 +183,9 @@ e10-cli form list-search <objId> <appId> <listId> --quick <fieldId1> <fieldId2>
169
183
  e10-cli form list-sort <objId> <appId> <listId> --field <fieldId1> <fieldId2> --order ASC
170
184
  e10-cli form list-sort <objId> <appId> <listId> --clear
171
185
 
186
+ # 主表/明细统计完整指南:references/form/guide-list-stats.md
187
+ # 明细 count 支持只填 type/subFormId;批量入口:form list-stats detail
188
+ # PC/MOBILE 可能共享统计项;以保存后的 mobileStatistics 为准,不能承诺只影响 PC
172
189
  # 顶部统计:type=sum 求和 / count 计数 / avg 平均 / max 最大 / min 最小
173
190
  # 可选:thousandths=true 千分位 / decimalPlaces="2" 小数位 / unit="万" 单位(unitType=tenThousand)
174
191
  e10-cli form list-stats <objId> <appId> <listId> --add '{"fieldId":"...","type":"sum","name":"合同总金额","thousandths":true,"decimalPlaces":"2","unit":"万"}'
@@ -232,7 +249,7 @@ e10-cli form list-search-group <objId> <appId> <listId> --remove <fieldId>
232
249
  e10-cli form list-search-group <objId> <appId> <listId> --clear
233
250
  ```
234
251
 
235
- 字段 ID 来自 `form read <objId> --app-id <appId>` 或 `form list-columns` 当前列(系统列如 `2`创建者/`3`创建时间/`5`数据ID 也可增删)。保存成功后命令打印 `移动端配置: 保持原样` 即确认移动端未被触碰。
252
+ 字段 ID 来自 `form read <objId> --app-id <appId>` 或 `form list-columns` 当前列(系统列如 `2`创建者/`3`创建时间也可增删;`5`数据ID主键自动保留,禁止移除)。显示列命令保存后回读校验,`otherTerminalPreserved:true` 表示另一终端配置核对一致。
236
253
 
237
254
  ## formView 固定闭环
238
255
 
@@ -0,0 +1,52 @@
1
+ # 台账显示列批量配置
2
+
3
+ 适用于已有 `nListView`、`multiView` 的显示列。`listId` 取 `form list-view <objId> <appId>`;新建表格视图仍使用 `form table-view create`。关联浏览框的显示字段使用 `form ebuilder-columns`。
4
+
5
+ ## 查看、追加、移除
6
+
7
+ ```shell
8
+ e10-cli form list-columns <objId> <appId> <listId> --json
9
+ e10-cli form list-columns <objId> <appId> <listId> --add <字段ID1> <字段ID2> --json
10
+ e10-cli form list-columns <objId> <appId> <listId> --remove <字段ID1> <字段ID2> --json
11
+ ```
12
+
13
+ `--add` 按输入顺序追加到隐藏主键之前,已存在的列复用原配置;重复执行且无变化时返回 `unchanged:true`,不保存。`--remove` 可与 `--add` 同时使用,但不能对同一字段同时增删。移除不存在的列会报错;数据主键禁止移除。
14
+
15
+ ## 一次设置顺序、宽度和格式
16
+
17
+ 先读取当前列,按需求生成 UTF-8 的 `columns.json`。数组表示**完整业务列清单**:未列入的业务列会移除;数组顺序就是显示顺序。字段 ID 使用字符串,支持 `fieldId` 或 `id`,也支持仅填 ID 字符串。
18
+
19
+ ```json
20
+ [
21
+ {"fieldId":"1310832462830059523","width":220},
22
+ {"fieldId":"1310832462830059527","width":150,"format":"yyyy-MM-dd"},
23
+ {"fieldId":"1310832462830059528","width":150,"format":"THOUSANDS","decimalLength":2}
24
+ ]
25
+ ```
26
+
27
+ ```shell
28
+ e10-cli form list-columns <objId> <appId> <listId> --set @columns.json --json
29
+ ```
30
+
31
+ 示例 ID 来自维森测试93项目任务表,其他表单需替换。`--set` 不能与增删选项混用;空数组只保留数据主键。配置文件不是原始 `tableField` 快照,不要填隐藏主键、uid、eventGroup 等内部属性。
32
+
33
+ | 属性 | 语义 |
34
+ |---|---|
35
+ | `fieldId` / `id` | 必填,当前表单的字段 ID,不可重复 |
36
+ | `text` | 非空显示名称 |
37
+ | `width` | 正数列宽,新列默认 150 |
38
+ | `format` | 日期格式或数值 `THOUSANDS`;`null` 清除 |
39
+ | `decimalLength` | 0–20 整数;`null` 清除 |
40
+ | `hidden` | 是否隐藏业务列,布尔值 |
41
+ | `viewDataDetail` | 是否显示关联数据详情,布尔值 |
42
+
43
+ 已有列只覆盖明确提供的属性,未指定的格式、单位、点击事件、uid 等保留;新列从字段元数据构造。明细子字段从 `ds/fields` 嵌套目录解析,必要时 `getFormField` 补查;设置 `mainField:false`,不带明细展开容器属性。不能把明细子表容器作为普通列添加。
44
+
45
+ ## 保存与验收
46
+
47
+ - 默认改 PC,可用 `--terminal mobile` 修改移动端 `tableField`;移动端卡片布局的 `listField/cardLayout` 不属于此命令。
48
+ - 全部字段与参数解析成功后,只调用一次 `saveNListConfig`。先读取真实 PC/MOBILE 配置,另一终端原样回传;读取失败默认中止。仅明确只用 PC 时允许 `--pc-only`,此时若移动端读取失败,结果标明未保留校验。
49
+ - 自动保留隐藏数据主键,缺失时补齐。保存后回读核对列 ID、顺序、属性以及另一终端配置;仅忽略平台每次读取重新生成的按钮动作/事件 ID。
50
+ - `verified:true` 表示接口回读通过。回读不一致时返回错误,保存可能已发生,应读取配置定位差异后处理;页面实际显示仍按需求验收。
51
+
52
+ 计划模板的「台账/视图配置 → 显示列批量设置」记录目标视图、终端、增量或整组模式、字段顺序、宽度/格式、配置文件路径与回读/页面验收结果。
@@ -0,0 +1,83 @@
1
+ # 顶部统计:主表与明细
2
+
3
+ `form list-stats` 配置已有台账视图的顶部统计。支持 sum/count/avg/max/min,以及千分位、小数位、万/亿单位、条件统计。来源表单 `objId`、应用 `appId`、目标视图 `listId` 与明细子表 `subFormId` 是不同 ID。
4
+
5
+ ## 查询及单项配置
6
+
7
+ ```bash
8
+ e10-cli form list-stats <objId> <appId> <listId> --json
9
+ e10-cli form list-stats <objId> <appId> <listId> --add @stat.json
10
+ e10-cli form list-stats <objId> <appId> <listId> --remove <statId>
11
+ ```
12
+
13
+ 主表与明细字段均使用真实 fieldId;CLI 展开 `ds/fields` 的明细分组,未命中时按 `getFormField` 补查。字段必须属于当前表单,指定 subFormId 时必须与字段实际归属一致。
14
+
15
+ 付款金额统计示例:
16
+
17
+ ```json
18
+ {
19
+ "fieldId": "1310832033224278033",
20
+ "type": "sum",
21
+ "name": "合同付款金额",
22
+ "decimalPlaces": "2",
23
+ "thousandths": true
24
+ }
25
+ ```
26
+
27
+ 明细记录计数可省略 fieldId:
28
+
29
+ ```json
30
+ {
31
+ "type": "count",
32
+ "subFormId": "1310832033224278030",
33
+ "name": "付款记录数"
34
+ }
35
+ ```
36
+
37
+ 计数写为 `fieldId="5" + subFormId`,统计明细记录数。传明细字段做 count 也会转成该子表的记录计数,并非此字段非空值计数。主表记录计数可使用 `{"type":"count","name":"记录数"}`;已有传主表 fieldId 的用法继续接受。
38
+
39
+ 主表的 subFormId 写 `-1`,明细写实际子表 ID。**当前平台会将明细字段 sum 等字段聚合回读的 subFormId 规范化为 `-1`,仍由唯一 fieldId 定位明细字段;明细 count 必须保留子表 ID。** 回读校验兼容这种规范化,不允许字段或计数子表发生变化。
40
+
41
+ 格式参数:`thousandths` 为布尔值;`decimalPlaces` 为 -1 或 0–20 的整数;单位支持 `unit: "万"/"亿"` 或 `unitType: "none"/"tenThousand"/"hundredMillion"`。主表保持原默认小数位 -1,明细非计数默认 2,计数默认 -1。sum/avg 要求数值字段。
42
+
43
+ ## 条件统计
44
+
45
+ ```json
46
+ {
47
+ "fieldId": "1310832033224278033",
48
+ "type": "sum",
49
+ "name": "正数付款金额",
50
+ "conditions": [
51
+ {"fieldId": "1310832033224278033", "func": "gt", "value": 0}
52
+ ]
53
+ }
54
+ ```
55
+
56
+ 条件支持主表字段和本次统计子表字段,多个条件默认 AND。`valueField` 可引用字段 ID 或唯一名称,字段引用也校验子表归属。跨其他明细子表的条件拒绝保存,避免产生不明确的关联语义。
57
+
58
+ 条件写入明文 `rootdata`,无需 LZW。明细节点携带 `mainField=false`、`subTableId` 等信息;不能把它当成主表字段。操作符与现有条件构建器一致:eq/neq/gt/lt/range/aggregate/unaggregate/contains/uncontains/empty/nempty/startWith/endWith,支持原兼容别名。
59
+
60
+ ## 批量明细统计
61
+
62
+ ```bash
63
+ e10-cli form list-stats detail <objId> <appId> <listId> <subFormId> --fields <金额fieldId> --name-prefix "付款-"
64
+ ```
65
+
66
+ 为指定数值字段分别生成 sum,并增加一项子表 count;一次保存。省略 `--fields` 时使用字段目录中该子表的全部数值字段。名称为“前缀+字段名+合计”和“前缀+子表名+记录数”。
67
+
68
+ 重复运行时,已有同名同配置项会复用并返回 `unchanged/reused`,不会重复新增;同名不同配置则报错,应先查询并明确移除旧项。批量操作同样可以使用 `--pc-only`。
69
+
70
+ ## 保存与移动端
71
+
72
+ - 保留 PC 完整配置,仅更新 `listStatistics`;删除用 `operation: DELETE`,不能只从数组移除。
73
+ - 读取真实移动端配置作为 `mConfig` 原样回传。默认移动端读取失败就停止;仅明确不使用移动端时加 `--pc-only`。
74
+ - 保存后校验新增项、原有项、删除结果及移动端配置。`verified: true` 表示配置回读一致,不等于已经核对实际统计数值。
75
+ - **维森测试93当前平台按 listId 共享 PC/MOBILE 统计项。** 当保存前后两端统计集合均对应一致时,返回 `mobileStatistics: "shared"`;改统计会同时影响两端。移动端独有统计丢失或其他配置变化仍报错。不要承诺共享环境下“只改 PC 统计”。
76
+ - 比较移动端配置时,仅排除已实证每次读取会重建的按钮事件临时 ID;业务按钮 ID、动作内容、列配置等仍核对。`mobilePreserved` 表示移动端其余配置及独立统计得到保护。
77
+ - 如果提示“已保存,但回读不一致”,先查询统计和移动端状态,不直接重试新增。
78
+
79
+ ## 计划与验收
80
+
81
+ 计划模板 3.3 的顶部统计项应记录:视图 ID、主表/明细范围、子表名称/ID、字段名称/ID、聚合方式、条件、格式、统计项 ID、PC/MOBILE 共享状态及验证结果。
82
+
83
+ 在“合同付款”视图验证:明细金额 sum、子表 count、明细条件、主表回归、重复运行、删除回读和移动端保护。不要改写用户已经配置的“合同付款金额”“付款记录数”;使用独立名称测试,结束清理临时项。实际金额与记录数须另用已知数据核对,不能仅凭保存成功认定数值正确。