weaver-e10-builder 1.5.1 → 1.5.3

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/form-add-detail-table.js +3 -3
  2. package/dist/commands/form-add-detail-table.js.map +1 -1
  3. package/dist/commands/form-add-physical-field.d.ts +3 -0
  4. package/dist/commands/form-add-physical-field.d.ts.map +1 -0
  5. package/dist/commands/form-add-physical-field.js +126 -0
  6. package/dist/commands/form-add-physical-field.js.map +1 -0
  7. package/dist/commands/form-data.d.ts.map +1 -1
  8. package/dist/commands/form-data.js +125 -0
  9. package/dist/commands/form-data.js.map +1 -1
  10. package/dist/commands/form-ebuilder-columns.d.ts.map +1 -1
  11. package/dist/commands/form-ebuilder-columns.js +3 -3
  12. package/dist/commands/form-ebuilder-columns.js.map +1 -1
  13. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  14. package/dist/commands/form-ebuilder-scope.js +3 -4
  15. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  16. package/dist/commands/form-field-lang.d.ts.map +1 -1
  17. package/dist/commands/form-field-lang.js +3 -4
  18. package/dist/commands/form-field-lang.js.map +1 -1
  19. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  20. package/dist/commands/form-field-linkage.js +4 -3
  21. package/dist/commands/form-field-linkage.js.map +1 -1
  22. package/dist/commands/form-formula-linkage.d.ts.map +1 -1
  23. package/dist/commands/form-formula-linkage.js +4 -2
  24. package/dist/commands/form-formula-linkage.js.map +1 -1
  25. package/dist/commands/form-formula.d.ts.map +1 -1
  26. package/dist/commands/form-formula.js +5 -5
  27. package/dist/commands/form-formula.js.map +1 -1
  28. package/dist/commands/form-layout.d.ts.map +1 -1
  29. package/dist/commands/form-layout.js +6 -0
  30. package/dist/commands/form-layout.js.map +1 -1
  31. package/dist/commands/form-list-click.d.ts.map +1 -1
  32. package/dist/commands/form-list-click.js +3 -2
  33. package/dist/commands/form-list-click.js.map +1 -1
  34. package/dist/commands/form-list-permission.js +1 -1
  35. package/dist/commands/form-list-permission.js.map +1 -1
  36. package/dist/commands/form-physical-table.d.ts +3 -0
  37. package/dist/commands/form-physical-table.d.ts.map +1 -0
  38. package/dist/commands/form-physical-table.js +195 -0
  39. package/dist/commands/form-physical-table.js.map +1 -0
  40. package/dist/commands/form-relate.d.ts.map +1 -1
  41. package/dist/commands/form-relate.js +3 -2
  42. package/dist/commands/form-relate.js.map +1 -1
  43. package/dist/commands/form-validate.d.ts.map +1 -1
  44. package/dist/commands/form-validate.js +3 -3
  45. package/dist/commands/form-validate.js.map +1 -1
  46. package/dist/commands/form-view.d.ts.map +1 -1
  47. package/dist/commands/form-view.js +2 -0
  48. package/dist/commands/form-view.js.map +1 -1
  49. package/dist/commands/form.d.ts +9 -3
  50. package/dist/commands/form.d.ts.map +1 -1
  51. package/dist/commands/form.js +150 -571
  52. package/dist/commands/form.js.map +1 -1
  53. package/dist/commands/org.d.ts.map +1 -1
  54. package/dist/commands/org.js +131 -7
  55. package/dist/commands/org.js.map +1 -1
  56. package/dist/commands/special.d.ts +24 -0
  57. package/dist/commands/special.d.ts.map +1 -0
  58. package/dist/commands/special.js +487 -0
  59. package/dist/commands/special.js.map +1 -0
  60. package/dist/commands/wf-form.d.ts.map +1 -1
  61. package/dist/commands/wf-form.js +4 -4
  62. package/dist/commands/wf-form.js.map +1 -1
  63. package/dist/commands/workflow-message.d.ts.map +1 -1
  64. package/dist/commands/workflow-message.js +1 -2
  65. package/dist/commands/workflow-message.js.map +1 -1
  66. package/dist/commands/workflow-operator-sign.js +1 -1
  67. package/dist/commands/workflow-operator-sign.js.map +1 -1
  68. package/dist/index.js +28 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  71. package/dist/services/actionflow/components/action_eb_update_compiler.js +54 -12
  72. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  73. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  74. package/dist/services/actionflow/components/index.js +6 -0
  75. package/dist/services/actionflow/components/index.js.map +1 -1
  76. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  77. package/dist/services/actionflow/components/multiple_execution.js +73 -13
  78. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  79. package/dist/services/actionflow/components/output.d.ts.map +1 -1
  80. package/dist/services/actionflow/components/output.js +144 -5
  81. package/dist/services/actionflow/components/output.js.map +1 -1
  82. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/send_message.js +60 -32
  84. package/dist/services/actionflow/components/send_message.js.map +1 -1
  85. package/dist/services/actionflow/components/serverless_action.d.ts +5 -0
  86. package/dist/services/actionflow/components/serverless_action.d.ts.map +1 -0
  87. package/dist/services/actionflow/components/serverless_action.js +134 -0
  88. package/dist/services/actionflow/components/serverless_action.js.map +1 -0
  89. package/dist/services/actionflow/components/webhook_trigger.d.ts +5 -0
  90. package/dist/services/actionflow/components/webhook_trigger.d.ts.map +1 -0
  91. package/dist/services/actionflow/components/webhook_trigger.js +85 -0
  92. package/dist/services/actionflow/components/webhook_trigger.js.map +1 -0
  93. package/dist/services/actionflow/context_preflight.d.ts +6 -0
  94. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  95. package/dist/services/actionflow/context_preflight.js +247 -7
  96. package/dist/services/actionflow/context_preflight.js.map +1 -1
  97. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  98. package/dist/services/actionflow/context_provider.js +67 -3
  99. package/dist/services/actionflow/context_provider.js.map +1 -1
  100. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -1
  101. package/dist/services/actionflow/custom_trigger_context.js +9 -2
  102. package/dist/services/actionflow/custom_trigger_context.js.map +1 -1
  103. package/dist/services/actionflow/formula_service.d.ts +2 -0
  104. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  105. package/dist/services/actionflow/formula_service.js +381 -63
  106. package/dist/services/actionflow/formula_service.js.map +1 -1
  107. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  108. package/dist/services/actionflow/generation_service.js +9 -0
  109. package/dist/services/actionflow/generation_service.js.map +1 -1
  110. package/dist/services/actionflow/param_group_dto.d.ts +5 -0
  111. package/dist/services/actionflow/param_group_dto.d.ts.map +1 -0
  112. package/dist/services/actionflow/param_group_dto.js +181 -0
  113. package/dist/services/actionflow/param_group_dto.js.map +1 -0
  114. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  115. package/dist/services/actionflow/preflight_service.js +53 -11
  116. package/dist/services/actionflow/preflight_service.js.map +1 -1
  117. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  118. package/dist/services/actionflow/readback_verifier.js +14 -1
  119. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  120. package/dist/services/actionflow/update_service.d.ts.map +1 -1
  121. package/dist/services/actionflow/update_service.js +14 -8
  122. package/dist/services/actionflow/update_service.js.map +1 -1
  123. package/dist/services/actionflow/webhook_source.d.ts +4 -0
  124. package/dist/services/actionflow/webhook_source.d.ts.map +1 -0
  125. package/dist/services/actionflow/webhook_source.js +99 -0
  126. package/dist/services/actionflow/webhook_source.js.map +1 -0
  127. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  128. package/dist/services/actionflow/workflow_compiler.js +1 -0
  129. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  130. package/dist/services/form-create.d.ts +45 -2
  131. package/dist/services/form-create.d.ts.map +1 -1
  132. package/dist/services/form-create.js +78 -8
  133. package/dist/services/form-create.js.map +1 -1
  134. package/dist/services/form-data-openapi.d.ts +142 -0
  135. package/dist/services/form-data-openapi.d.ts.map +1 -0
  136. package/dist/services/form-data-openapi.js +363 -0
  137. package/dist/services/form-data-openapi.js.map +1 -0
  138. package/dist/services/form-field-build.d.ts +71 -0
  139. package/dist/services/form-field-build.d.ts.map +1 -0
  140. package/dist/services/form-field-build.js +436 -0
  141. package/dist/services/form-field-build.js.map +1 -0
  142. package/dist/services/form-field-template.d.ts +71 -0
  143. package/dist/services/form-field-template.d.ts.map +1 -0
  144. package/dist/services/form-field-template.js +103 -0
  145. package/dist/services/form-field-template.js.map +1 -0
  146. package/dist/services/form-field-validate.d.ts +26 -0
  147. package/dist/services/form-field-validate.d.ts.map +1 -0
  148. package/dist/services/form-field-validate.js +121 -0
  149. package/dist/services/form-field-validate.js.map +1 -0
  150. package/dist/services/form-id.d.ts +50 -0
  151. package/dist/services/form-id.d.ts.map +1 -0
  152. package/dist/services/form-id.js +110 -0
  153. package/dist/services/form-id.js.map +1 -0
  154. package/dist/services/form-layout-grid.d.ts +123 -0
  155. package/dist/services/form-layout-grid.d.ts.map +1 -0
  156. package/dist/services/form-layout-grid.js +177 -0
  157. package/dist/services/form-layout-grid.js.map +1 -0
  158. package/dist/services/form-layout-insert.d.ts +24 -1
  159. package/dist/services/form-layout-insert.d.ts.map +1 -1
  160. package/dist/services/form-layout-insert.js +192 -27
  161. package/dist/services/form-layout-insert.js.map +1 -1
  162. package/dist/services/form-physical-table.d.ts +115 -0
  163. package/dist/services/form-physical-table.d.ts.map +1 -0
  164. package/dist/services/form-physical-table.js +153 -0
  165. package/dist/services/form-physical-table.js.map +1 -0
  166. package/dist/services/form-table-view.d.ts.map +1 -1
  167. package/dist/services/form-table-view.js +2 -11
  168. package/dist/services/form-table-view.js.map +1 -1
  169. package/dist/services/form-view.d.ts +2 -0
  170. package/dist/services/form-view.d.ts.map +1 -1
  171. package/dist/services/form-view.js +57 -7
  172. package/dist/services/form-view.js.map +1 -1
  173. package/dist/services/form-virtual.d.ts.map +1 -1
  174. package/dist/services/form-virtual.js +6 -1
  175. package/dist/services/form-virtual.js.map +1 -1
  176. package/dist/services/org-employee.d.ts +105 -1
  177. package/dist/services/org-employee.d.ts.map +1 -1
  178. package/dist/services/org-employee.js +186 -5
  179. package/dist/services/org-employee.js.map +1 -1
  180. package/dist/services/special-page.d.ts +85 -0
  181. package/dist/services/special-page.d.ts.map +1 -0
  182. package/dist/services/special-page.js +129 -0
  183. package/dist/services/special-page.js.map +1 -0
  184. package/dist/services/special-route.d.ts +92 -0
  185. package/dist/services/special-route.d.ts.map +1 -0
  186. package/dist/services/special-route.js +93 -0
  187. package/dist/services/special-route.js.map +1 -0
  188. package/dist/services/workflow-node-layout.d.ts +13 -1
  189. package/dist/services/workflow-node-layout.d.ts.map +1 -1
  190. package/dist/services/workflow-node-layout.js +11 -3
  191. package/dist/services/workflow-node-layout.js.map +1 -1
  192. package/package.json +1 -1
  193. package/skill-docs/SKILL.md +5 -5
  194. package/skill-docs/_catalog.md +1 -0
  195. package/skill-docs/actionflows/SKILL.md +5 -4
  196. package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -38
  197. package/skill-docs/actionflows/references/components/logic/Output.md +9 -2
  198. package/skill-docs/actionflows/references/components/message/SendMessage.md +3 -3
  199. package/skill-docs/actionflows/references/components/serverless/ServerlessAction.md +42 -0
  200. package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +89 -0
  201. package/skill-docs/actionflows/references/dynamic_capability_matrix.md +2 -2
  202. package/skill-docs/references/common/ref-cli-commands.md +11 -3
  203. package/skill-docs/references/form/guide-form-association.md +1 -1
  204. package/skill-docs/references/form/guide-form-data.md +30 -0
  205. package/skill-docs/references/form/guide-form-layout-incremental.md +18 -3
  206. package/skill-docs/references/form/guide-form-linkage.md +2 -2
  207. package/skill-docs/references/form/guide-form-physical-table.md +146 -0
  208. package/skill-docs/references/form/ref-form-fields.md +1 -1
  209. package/skill-docs/references/hrm/guide-org-employee.md +71 -3
  210. package/skill-docs/references/report/cell-config-echo-guide.md +1 -1
  211. package/skill-docs/references/report/dataset-query-filter-guide.md +3 -3
  212. package/skill-docs/references/report/date-range-query-reference.md +2 -2
  213. package/skill-docs/references/report/query-condition-api-guide.md +11 -11
  214. package/skill-docs/references/report/report-designer-feature-map.md +1 -1
  215. package/skill-docs/references/report/report-permission-guide.md +2 -2
  216. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +6 -6
  217. package/skill-docs/references/workflow/guide-workflow.md +1 -1
@@ -15,6 +15,7 @@
15
15
  | 字段联动、跨表带出、field-linkage、多跳带出、带出字段赋值、Text 字段取名称 | `references/form/guide-field-linkage.md` |
16
16
  | 新建表单、form create、EB 表单标准创建流程 | `references/form/guide-create-form.md` |
17
17
  | 二级明细、子明细、父级行标识、子级行标识、多级明细 | `references/form/guide-form-sub-detail.md` |
18
+ | 物理表、多物理表、附属物理表、saveFormTable、getFormAGroupList、字段管理其他页签、字段超过100、add-physical-table、add-physical-field | `references/form/guide-form-physical-table.md` |
18
19
  | 虚拟表、虚拟表单、数据源表单、业务表展示、数据加工结果 | `references/form/guide-virtual-form.md` |
19
20
  | 字段定义、字段类型、关联字段码表、DateRange、multiple | `references/form/ref-form-fields.md` |
20
21
  | FLOW/EXCEL、布局样表、布局蓝图、字段分组、singleRow | `references/form/guide-form-layout-planning.md` |
@@ -49,12 +49,12 @@ description: "将业务需求编译为 Weaver ESB 动作流,或读取已有动
49
49
  2. 只传 `component-describe` 声明的参数;固定值与动态值根据业务需求选择,不能为了动态而动态。
50
50
  3. 语义 plan 的节点配置统一放在 `params`:`event.params`、`actions[*].params` 以及条件/循环内部节点的 `params`。`data` 仅属于平台回读/更新 DTO,不能出现在 `generate` 语义计划中;CLI 会在调用任何平台接口前拒绝该结构,并提示具体路径。
51
51
  4. 中文 plan 写入当前工作区 `.actionflow-plans/`,以 `planFile` 传给 CLI;不在 Skill 目录写临时文件。CLI 不会自动删除 plan;确认 `valid=true`、`saved=true`、`readBackVerified=true` 后才允许手工清理。
52
- 5. 不把 `Output` 写入 `actions`。需要配置终止状态、提示或页面动作时使用顶层 `finalOutput.params`;平台内部 FormulaBean 由 CLI 生成,只有组件契约明确要求前端原对象时才传原生 DTO。
52
+ 5. 不把 `Output` 写入 `actions`。需要配置终止状态、提示或页面动作时使用顶层 `finalOutput.params`;提醒内容使用前端富文本组件对应的 `reminderContent`(`ContestSettingDTO`,动态片段放在 `formulaBeans`),不要使用旧的 `reminderMsgFormula`;平台内部 FormulaBean 由 CLI 生成,只有组件契约明确要求前端原对象时才传原生 DTO。
53
53
  5.1. 所有 CLI 生成或继续编译的 FormulaBean,只要包含 `frontId`,允许使用空串;非空时必须使用平台真实字段 ID 的纯数字字符串。`field_<数字>` 仅可在生成时规范化为 `<数字>`。禁止把字段名、paramKey 尾段、临时公式 ID 或其他包含字母/符号的值写入 `frontId`;非空值无法解析为纯数字时必须直接报错。
54
54
  6. 定时组件优先使用平台原生频率:`rate=1` 一次、`2` 按小时、`3` 按日、`4` 按周、`5` 按月,并按需提供 `cycle`、`hour`、`day`、`week`、`atWeek`、`atWeekDetail` 或 `lastWeek`;只有明确选择 `rate=6` 时才传 `cornString`。图形化频率必须提供 `startTime`。
55
55
  7. 触发器或查询组件未被需求明确限制输出字段时,不传 `queryFields`(或传空数组):CLI 会默认全选,包含“数据ID”。如果需求明确引用某个业务字段,必须从当前租户的实时字段接口/字段选择器获取完整字段对象并保存真实 `id`,不能凭字段名、临时 ID 或只拼 `id/content`。查询节点还必须使用自身真实节点 ID 作为 `dataSource.enquiryId`,否则平台可能静默丢弃业务字段。正式回读必须确认每个声明的 `queryFields` 仍存在;缺失即生成失败,不能仅凭接口 `code=200`、`saved=true` 判定成功。e-builder 数据触发后发送消息且未显式给链接时,CLI 自动补 PC/移动端当前记录详情链接;不手写 `{formId}` / `{dataId}` 的 FormulaBean。查询结果字段动态赋值必须按手工设计器对象编译:普通业务字段使用 `FormField.<查询表单ID>.field_<真实字段ID>`,`config.paramKey` 使用 `<查询表单ID>.field_<真实字段ID>`,`config.fieldInfo.tablePrimaryKey` 为 `FormField`;系统字段按平台真实字段键(例如 `id`)保留。禁止使用 `FormData.<表单ID>[临时位置]...`,也禁止把临时公式 ID 当作 `frontId`。
56
56
  8. `ActionEbAdd` 批量新增以 `basisValue` 为明细行上下文:来源于该行的字段都用 `mapping`,编译为“依据值下级”(`switchType:"sub"`),下拉字段也同样处理。只有已核实来源/目标选项 ID 不同且语义需要转换时,才使用 `SWITCH`。关联 e-builder 字段应引用查询结果的 `数据ID`,固定格式为 `{target,kind:"query_result",source:"<EnquiryForm ref>",formId,fieldId:"id",index:0}`;`kind:"enquiry"`、`sourceId` 等旧写法会直接报错,绝不降级为空固定值。
57
- 9. 动态赋值可使用或新建动作流变量、租户常量:已有资源必须用真实 ID;计划新建变量写顶层 `variables[]`,新建常量写 `constantDefinitions[]`,常量分组可传 `groupPk` 或 `groupName`。变量按当前 `applicationId + sceneId` 隔离,常量按分组跨动作流复用。生成时先调用真实接口创建/解析资源,再编译为变量 `type:"7"` 或常量 `type:"5"` FormulaBean;详细格式见 `references/dynamic_resources.md`。消息 `parts` 也支持 `variable`/`constant` 动态片段。
57
+ 9. 动态赋值可使用或新建动作流变量、租户常量:已有资源必须用真实 ID;计划新建变量写顶层 `variables[]`,新建常量写 `constantDefinitions[]`,常量分组可传 `groupPk` 或 `groupName`。变量按当前 `applicationId + sceneId` 隔离,常量按分组跨动作流复用。生成时先调用真实接口创建/解析资源,再编译为变量 `type:"7"` 或常量 `type:"5"` FormulaBean;详细格式见 `references/dynamic_resources.md`。消息 `SendMessage.msgTitlev/msgContentv/picLink/msgPcLink/msgMobileLink` 的 `parts` 支持 `variable`/`constant` 动态片段,并统一保存为 `ContestSettingDTO`。
58
58
  9.1. 每个参数先分为“动态公式属性”“动态人员属性”“固定平台资源属性”三类:上下文、系统变量、变量、常量、函数/公式必须保留为 FormulaBean;动态人员必须使用真实人员字段上下文或系统变量,不得把引用里的 `id` 当人员 Browser ID 查询;工作流、文档目录、按钮、规则等平台资源只有在其组件契约明确提供动态引用时才允许动态化。生成前必须记录本次组件/属性的判定,生成后按属性检查回读结果;具体映射和验证状态见 `references/dynamic_capability_matrix.md`。
59
59
  10. 自定义事件和内置 MQ 的参数必须按对应平台组件说明提供原生参数对象;`CustomTrigger.customData`、`InnerMQListener.receiveParams`、`InnerMQSend.sendParams` 不能用猜测的字段替代。若验证要求“输入参数里有字段”,必须在生成前提供至少一行真实原生参数;`tables:[]`、`tableList:[]` 或省略 `receiveParams` 只能表示无输入参数,不能作为有参数的占位。`InnerMQListener` 与 `InnerMQSend` 是动作流级互斥组件,同一计划(包括条件/循环嵌套)同时出现时,CLI 在任何平台写接口前直接报错。
60
60
  11. 根触发节点的 `event.attr.icon` 必须使用平台真实图标:`CustomTrigger` 为 `Icon-N-Triggerrul`,`InnerMQListener` 为 `Icon-built-in-mq-listening-mcolor`;组件目录里的动作图标不能覆盖根触发器图标。保存后回读必须同时检查触发器图标、已声明输入参数的数量和查询字段,不能仅凭 `valid=true` / `saved=true` 判定配置正确。
@@ -126,11 +126,11 @@ e10-cli actionflow update '@update-plan.json' --out update-result.json #
126
126
 
127
127
  ## 触发器边界
128
128
 
129
- 当前可生成的事件触发器:`ApproveTrigger`(流程事件)、`EventFormData`(e-builder 数据新增/更新/删除/字段变化)、`EventButton`(点击 e-builder 指定按钮)、`DateTrigger`、`TimeBatchTrigger`、`SimpleScheduler`、`CustomTrigger`(自定义事件)和 `InnerMQListener`(内置 MQ 监听)。`EventButton` 必须先用 `e10-cli actionflow form-buttons '{"tableId":"<表单ID>","appId":"<应用ID>"}'` 查询真实按钮,再以 `targetForm`、`buttonType:[{id,name,buttonLocation:"before"|"after"}]` 和可选 `triggerType` 生成;不得用 `EventFormData` 冒充按钮点击。`CustomTrigger` 和 `InnerMQListener` 的原生参数要求见 `references/components/trigger/CustomTrigger.md`、`references/components/trigger/InnerMQListener.md`。
129
+ 当前可生成的事件触发器:`ApproveTrigger`(流程事件)、`EventFormData`(e-builder 数据新增/更新/删除/字段变化)、`EventButton`(点击 e-builder 指定按钮)、`DateTrigger`、`TimeBatchTrigger`、`SimpleScheduler`、`CustomTrigger`(自定义事件)、`InnerMQListener`(内置 MQ 监听)和 `WebHookTrigger`(外部 WebHook 请求)。`EventButton` 必须先用 `e10-cli actionflow form-buttons '{"tableId":"<表单ID>","appId":"<应用ID>"}'` 查询真实按钮,再以 `targetForm`、`buttonType:[{id,name,buttonLocation:"before"|"after"}]` 和可选 `triggerType` 生成;不得用 `EventFormData` 冒充按钮点击。`CustomTrigger`、`InnerMQListener` 和 `WebHookTrigger` 的原生参数要求见 `references/components/trigger/CustomTrigger.md`、`references/components/trigger/InnerMQListener.md`、`references/components/trigger/WebHookTrigger.md`。
130
130
 
131
131
  `CustomTrigger` 的上下文动态赋值使用 `SelectParams` 作为最终上下文根。`paramKey` 只写业务路径,不写 `FormData.`、`ApprovalData.` 或 `SelectParams.` 前缀;主表字段格式为 `主表key.字段key`,明细字段格式为 `主表key.明细表key[].字段key`,主表与明细表必须沿用同一个主表 key。最终公式中的 `value`、`currentParamKey` 和 `allParamKey` 才补 `SelectParams.` 前缀,不能把明细字段写成 `FormData.明细表key[].字段key`。如果动态赋值来源于该触发器生成的 `customData`(`CustSetFormDto`),必须先在 `customData.tableList[]` 定位 `CustFormTableDto`,表维度取表对象 `id`,字段维度再从该表 `fields[]` 定位 `CustFormDetailDto` 并取字段对象 `id`,把这个 ID 设置到关联 FormulaBean.frontId;不得使用目标字段 ID、FormulaBean.id、表/字段名称或 paramKey 尾段。对应 ID 缺失时 frontId 使用空串,非空值必须为纯数字字符串。完整规则见 `references/components/trigger/CustomTrigger.md`。
132
132
 
133
- 动作 `Http` 用于调用当前租户已配置的 HTTP/HTTPS 接口,参数要求见 `references/components/http/Http.md`;HTTPS 使用同一个 `Http` 组件,不能把协议地址当成新的组件类型。生成前会实时读取并校验“连接器 → 资源 → 接口 → 接口详情”,节点标题按“当前连接器: 当前接口”回填,图标按当前连接器目录回填;不存在、跨租户或归属不一致时拒绝生成,不信任旧环境的 E9 等名称、地址、图标或原生映射。HTTP 请求字段通过 `inputParams` 配置,必须用接口详情真实返回的 `table`/`paramKey`,CLI 写入参数行的 `formulaData`,支持统一的固定值、上下文、系统变量及函数/公式赋值;不能猜参数或直接改写 `request.tables`。动作 `InnerMQSend` 用于向平台内置 MQ 发送消息,参数要求见 `references/components/message/InnerMQSend.md`。`InnerMQListener` 和 `InnerMQSend` 不能放在同一个动作流中;该约束也适用于 `update` 修改后的完整设计。
133
+ 动作 `Http` 用于调用当前租户已配置的 HTTP/HTTPS 接口,参数要求见 `references/components/http/Http.md`;HTTPS 使用同一个 `Http` 组件,不能把协议地址当成新的组件类型。生成前会实时读取并校验“连接器 → 资源 → 接口 → 接口详情”,节点标题按“当前连接器: 当前接口”回填,图标按当前连接器目录回填;不存在、跨租户或归属不一致时拒绝生成,不信任旧环境的 E9 等名称、地址、图标或原生映射。HTTP 请求字段通过 `inputParams` 配置,必须用接口详情真实返回的 `table`/`paramKey`,CLI 写入参数行的 `formulaData`,支持统一的固定值、上下文、系统变量及函数/公式赋值;不能猜参数或直接改写 `request.tables`。动作 `serverless/Action` 用于执行二开代码,参数要求见 `references/components/serverless/ServerlessAction.md`;输入和输出必须传前端参数设计器生成的原生 ParamBean 结构。动作 `InnerMQSend` 用于向平台内置 MQ 发送消息,参数要求见 `references/components/message/InnerMQSend.md`。`InnerMQListener` 和 `InnerMQSend` 不能放在同一个动作流中;该约束也适用于 `update` 修改后的完整设计。
134
134
 
135
135
  动作 `DMLExecute` 用于执行自定义 SQL 或存储过程,参数要求见 `references/components/database/DMLExecute.md`。只支持新版数仓结构,`operateType` 固定为 `0`;数据源连接 ID 必须通过 `actionflow datasource-list` 从当前环境取得,SQL 占位符与 `fieldSet` 必须严格对应。含 DML 的生成结果还要检查 `sqlAnalysisOk=true`,因为平台 SQL 分析失败可能不会阻断保存。
136
136
 
@@ -152,6 +152,7 @@ e10-cli actionflow update '@update-plan.json' --out update-result.json #
152
152
  | 人员 | `references/components/personnel/` |
153
153
  | 逻辑 | `references/components/logic/` |
154
154
  | HTTP/HTTPS 接口 | `references/components/http/` |
155
+ | serverless/Action 二开代码 | `references/components/serverless/` |
155
156
  | 消息提醒 | `references/components/message/` |
156
157
  | 内置 MQ / 自定义事件 | `references/components/trigger/`、`references/components/message/` |
157
158
  | 会议、日程 | `references/components/calendar/` |
@@ -1,38 +1,38 @@
1
- # 循环(MultipleExecution)
2
-
3
- 循环体通过 `actions` 提供,至少包含一个非 `Output` 动作,当前不支持循环嵌套。
4
-
5
- ## 循环方式
6
-
7
- | `cycleMode` | 场景 | 必填参数 |
8
- | --- | --- | --- |
9
- | `1` | 按指定次数 | `cycleTimes` |
10
- | `2` | 满足条件时继续 | `condition` |
11
- | `3` | 按列表逐条遍历 | `detailData` |
12
- | `4` | 按列表分批遍历 | `batchDetailData`、`batchSizeData` |
13
- | `5` | 存在下一页时继续 | `pageCycleData`(平台已有变量 FormulaBean) |
14
-
15
- ## 参数规则
16
-
17
- - `cycleTimes`:固定整数 `1-1000`,或实时上下文的 `context/reference`。动态引用必须使用 `getComponentContext` 返回的完整 `paramKey`;预检会保留来源字段的真实类型、所属组件和参数路径。
18
- - `detailData` / `batchDetailData`:只能引用真实 List/数组字段(表单明细、多选浏览框或上游动态列表)。不可用普通文本字段伪装为列表。
19
- - `batchSizeData`:固定整数 `2-1000`。
20
- - `condition`:使用 ESB `ConditionRule`,与动作流分支复用同一类规则树和 `saveCondition` 持久化;它不是 e-builder 表单动作的 `filterInput/ConditionSet`。左值可使用完整 `paramKey`、字段显示名、`paramName` 或真实字段 ID;编译器会按当前流程实时上下文回填真实 DTO。
21
- - `pageCycleData`:设计器会创建布尔变量并在循环体首节点写入“是否存在下一页”。当前只接受已存在的原始 `type: "7"` 变量 FormulaBean;尚未自动创建变量及赋值节点时,不生成该模式。
22
-
23
- ## 示例
24
-
25
- ```json
26
- {
27
- "type": "MultipleExecution",
28
- "params": {
29
- "cycleMode": "3",
30
- "detailData": {
31
- "kind": "context",
32
- "source": "event",
33
- "paramKey": "<workflowId>.<arrayField>[]"
34
- }
35
- },
36
- "actions": [{ "type": "SendMessage", "params": { "receiver": { "type": "all" }, "msgTitle": "逐条处理", "msgContent": "..." } }]
37
- }
38
- ```
1
+ # 循环(MultipleExecution)
2
+
3
+ 循环体通过 `actions` 提供,至少包含一个非 `Output` 动作,当前不支持循环嵌套。
4
+
5
+ ## 循环方式
6
+
7
+ | `cycleMode` | 场景 | 必填参数 |
8
+ | --- | --- | --- |
9
+ | `1` | 按指定次数 | `cycleTimes` |
10
+ | `2` | 满足条件时继续 | `condition` |
11
+ | `3` | 按列表逐条遍历 | `detailData` |
12
+ | `4` | 按列表分批遍历 | `batchDetailData`、`batchSizeData` |
13
+ | `5` | 存在下一页时继续 | `pageCycleData`(平台已有变量 FormulaBean) |
14
+
15
+ ## 参数规则
16
+
17
+ - `cycleTimes`:固定整数 `1-1000`,或实时上下文的 `context/reference`。动态引用必须使用 `getComponentContext` 返回的完整 `paramKey`;预检会保留来源字段的真实类型、所属组件和参数路径。
18
+ - `detailData` / `batchDetailData`:只能引用真实 List/数组字段(表单明细、多选浏览框或上游动态列表)。不可用普通文本字段伪装为列表。
19
+ - `batchSizeData`:固定整数 `2-1000`。
20
+ - `condition`:使用 ESB `ConditionRule`,与动作流分支复用同一类规则树和 `saveCondition` 持久化;它不是 e-builder 表单动作的 `filterInput/ConditionSet`。左值可使用完整 `paramKey`、字段显示名、`paramName` 或真实字段 ID;编译器会按当前流程实时上下文回填真实 DTO。
21
+ - `pageCycleData`:设计器会创建布尔变量并在循环体首节点写入“是否存在下一页”。当前只接受已存在的原始 `type: "7"` 变量 FormulaBean;尚未自动创建变量及赋值节点时,不生成该模式。
22
+
23
+ ## 示例
24
+
25
+ ```json
26
+ {
27
+ "type": "MultipleExecution",
28
+ "params": {
29
+ "cycleMode": "3",
30
+ "detailData": {
31
+ "kind": "context",
32
+ "source": "event",
33
+ "paramKey": "<workflowId>.<arrayField>[]"
34
+ }
35
+ },
36
+ "actions": [{ "type": "SendMessage", "params": { "receiver": { "type": "all" }, "msgTitlev": "逐条处理", "msgContentv": "..." } }]
37
+ }
38
+ ```
@@ -10,7 +10,9 @@
10
10
 
11
11
  ## 不可猜测
12
12
 
13
- 不要把 `Output` 写入 `actions`。`reminderMsgFormula` 与 `basisValue` 支持固定值、上下文、系统变量、变量、常量、查询结果和函数/公式;`jumpUrl` 在前端只允许固定文本。`fixedData`、`customOutputData` 属于平台原生高级输出结构,必须使用真实回读结构,不能猜测。
13
+ 不要把 `Output` 写入 `actions`。提醒内容必须使用前端富文本组件对应的 `ContestSettingDTO`,字段名是 `reminderContent`,不能再使用旧的 `reminderMsgFormula`。`basisValue` 仍支持固定值、上下文、系统变量、变量、常量、查询结果和函数/公式;`jumpUrl` 在前端只允许固定文本。`fixedData`、`customOutputData` 属于平台原生高级输出结构,必须使用真实回读结构,不能猜测。
14
+
15
+ `reminderContent` 支持两种输入:一是前端原生对象 `{id, content, formulaBeans, langSet}`;二是 CLI 语义模板 `{parts:[{type:"text",value:"..."},{type:"context",paramKey:"..."},{type:"system_variable",key:"{date}"},{type:"variable",id:"..."},{type:"constant",id:"..."}]}`。编译器会生成 Base64 内容和 `#{paramN}` 占位符,并将每个动态片段保存为 `formulaBeans[].value`。
14
16
 
15
17
  如果自定义触发动作流需要配置终止参数,在 `finalOutput.params.customParamSetting` 中使用同一套 `CustSetFormDto` 结构,`formType` 改为 `output`,新建时 `customId` 传空字符串,`deleteTableIds` 传空数组,`appId` 由编译器注入当前动作流应用 ID,关联 ID 由后端保存方法生成。终止参数字段的映射关系必须写在 `tableList[].fields[].formulaValue`,对应后端 `CustFormDetailDto.formulaValue`;不能放在字段的 `value`、`mapping` 或其他自定义属性中。
16
18
 
@@ -22,7 +24,12 @@
22
24
  "params": {
23
25
  "outputStatus": "0",
24
26
  "reminder": "1",
25
- "reminderMsgFormula": { "kind": "variable", "id": "<真实变量ID>", "name": "失败提示" },
27
+ "reminderContent": {
28
+ "parts": [
29
+ { "type": "text", "value": "失败:" },
30
+ { "type": "variable", "id": "<真实变量ID>", "name": "失败提示" }
31
+ ]
32
+ },
26
33
  "pageAction": "0"
27
34
  }
28
35
  }
@@ -10,7 +10,7 @@
10
10
 
11
11
  ## 不可猜测
12
12
 
13
- 标题和内容按需求选固定文本或 `parts` 模板;纯字符串保持固定值,只有 `parts` 模板才进入设计器的消息专用编辑器。模板会编译成“正文文本 + `#{paramN}` 占位符 + 每个占位符的独立绑定”,对应手动配置时右侧的形式。**本 Skill 生成消息标题/内容时统一使用 `parts` 模板**,不要把通用函数/公式对象直接作为消息正文输入;这只是本 Skill 的生成约定,不代表平台其他场景不能使用函数。`parts` 的动态项支持 `context`、`system_variable`、`variable`、`constant`,后两者必须按 `references/dynamic_resources.md` 使用真实资源或计划定义。需要拼接上下文时,必须拆成 `parts`,例如:
13
+ 提醒标题、提醒内容、推送图片 URL、PC 端链接和移动端链接统一使用前端 `AssignTextarea` 对应的 `ContestSettingDTO`。语义参数名分别为 `msgTitlev`、`msgContentv`、`picLink`、`msgPcLink`、`msgMobileLink`;可以传普通字符串、原生 `{id,content,formulaBeans,langSet}`,或 `parts` 模板。模板会编译成 Base64 内容、`#{paramN}` 占位符和独立 `formulaBeans`,对应手动配置时右侧的形式。**不再使用旧的 `msgTitle`、`msgContent`、`pcLink`、`mobileLink` 字段**。`parts` 的动态项支持 `context`、`system_variable`、`variable`、`constant`、`function`、`formula`、`query_result`,后两者必须按 `references/dynamic_resources.md` 使用真实资源或计划定义。需要拼接上下文时,必须拆成 `parts`,例如:
14
14
 
15
15
  ```json
16
16
  {
@@ -23,8 +23,8 @@
23
23
  }
24
24
  ```
25
25
 
26
- 需要动态接收人时传 `receiver: {"type":"context","paramKey":"<真实人员字段paramKey>","label":"<字段名>"}`,不能把人员字段当固定人员 ID,也不能省略 `paramKey`。模板上下文只传 `paramKey` 和 `label`,由 CLI 按消息编辑器的动态片段结构编译,并绑定当前触发节点。对定时批量、按日期字段、表单数据等 e-builder 记录触发器,未显式提供链接时 CLI 自动生成 PC/移动端详情链接:`formId` 为触发表单 ID 固定值,`dataId` 为上游“数据ID”动态上下文。显式 `pcLink` / `mobileLink` 会覆盖该默认行为。
26
+ 需要动态接收人时传 `receiver: {"type":"context","paramKey":"<真实人员字段paramKey>","label":"<字段名>"}`,不能把人员字段当固定人员 ID,也不能省略 `paramKey`。模板上下文只传 `paramKey` 和 `label`,由 CLI 按消息编辑器的动态片段结构编译,并绑定当前触发节点。对定时批量、按日期字段、表单数据等 e-builder 记录触发器,未显式提供链接时 CLI 自动生成 `msgPcLink` / `msgMobileLink` 的 PC/移动端详情链接:`formId` 为触发表单 ID 固定值,`dataId` 为上游“数据ID”动态上下文。显式 `msgPcLink` / `msgMobileLink` 会覆盖该默认行为。
27
27
 
28
28
  ## 最小计划
29
29
 
30
- `receiver`、`msgTitle`、`msgContent`。
30
+ `receiver`、`msgTitlev`、`msgContentv`。
@@ -0,0 +1,42 @@
1
+ # serverless/Action(`ServerlessAction`)
2
+
3
+ ## 何时使用
4
+
5
+ 用于执行平台的二开代码。`crossService=1` 时调用远程 serverless/Action 服务;`crossService=0` 时执行本地上传的 Java 类。
6
+
7
+ ## 参数
8
+
9
+ ```json
10
+ {
11
+ "actions": [
12
+ {
13
+ "type": "ServerlessAction",
14
+ "params": {
15
+ "codeType": "customAction",
16
+ "crossService": 1,
17
+ "groupId": "ces",
18
+ "serverVersion": "1.1",
19
+ "request": {
20
+ "primaryKey": "",
21
+ "name": "",
22
+ "tableId": "<ParamMappingBean.tableId>",
23
+ "mappingTableId": "<ParamMappingBean.mappingTableId>",
24
+ "tableData": []
25
+ },
26
+ "response": {
27
+ "primaryKey": "",
28
+ "name": "",
29
+ "tableId": "<ParamSettingBean.tableId>",
30
+ "tableData": []
31
+ }
32
+ }
33
+ }
34
+ ]
35
+ }
36
+ ```
37
+
38
+ - `codeType` 当前仅支持 `customAction`。
39
+ - `crossService=1` 时必须提供 `groupId`,`serverVersion` 按 provider/consumer 约定填写,可为空;`crossService=0` 时必须提供本地代码完整类路径 `address`。
40
+ - `request` 必须使用前端输入参数配置生成的原生 `ParamMappingBean`;`response` 必须使用前端输出参数配置生成的原生 `ParamSettingBean`。
41
+ - 参数行的 `id`、`parentId`、`paramKey`、`paramType`、`dataType` 和前端高级配置会被保留;缺失的参数表/字段 ID 由 CLI 补齐,不能用语义字符串替代原生结构。
42
+ - 二开动作执行后,可以引用 `Response.entry.<字段>` 上下文;请求参数上下文使用 `Request.entry.<字段>`。
@@ -0,0 +1,89 @@
1
+ # WebHook 请求触发(`WebHookTrigger`)
2
+
3
+ `WebHookTrigger` 对应前端 `custom-webhook` 和 Java `WebHookTriggerComponent`。它接收外部 HTTP 请求,按配置的请求参数触发动作流。
4
+
5
+ ## 语义计划
6
+
7
+ ```json
8
+ {
9
+ "event": {
10
+ "type": "WebHookTrigger",
11
+ "params": {
12
+ "requestUrl": "https://api.example.com/api/open-esb/server/webhook/trigger/order-created",
13
+ "request": {
14
+ "id": "webhook-request-1",
15
+ "mappingId": "webhook-mapping-1",
16
+ "tables": [
17
+ {
18
+ "name": "Params",
19
+ "primaryKey": "Params",
20
+ "tableId": "params-1",
21
+ "tableData": [
22
+ {
23
+ "id": "request-id",
24
+ "paramKey": "orderId",
25
+ "paramName": "orderId",
26
+ "showName": "订单 ID",
27
+ "paramType": "string",
28
+ "dataType": "attribute",
29
+ "required": true
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "name": "Header",
35
+ "primaryKey": "Header",
36
+ "tableId": "header-1",
37
+ "tableData": []
38
+ },
39
+ {
40
+ "name": "Body",
41
+ "primaryKey": "Body",
42
+ "tableId": "body-1",
43
+ "tableData": []
44
+ }
45
+ ]
46
+ },
47
+ "authAppIds": []
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ `request` 应按设计器节点数据传入 `id`、可选 `mappingId` 和 `tables`。`tables` 的 `name` 只能是 `Params`、`Header`、`Body`;`primaryKey`、`tableId`、`customData` 等已有平台字段会原样保留,至少一个分组的 `tableData` 需要有字段,字段对象应来自前端参数设置组件。
54
+
55
+ 生成时推荐直接传设计器返回的完整 `requestUrl`。如果只有 `requestCode`,编译器也会生成 `/api/open-esb/server/webhook/trigger/<requestCode>` 形式的公开地址;Java 组件保存时使用最后一段作为 code。
56
+
57
+ ## 触发上下文
58
+
59
+ Webhook 请求运行时由平台解析为三个上下文分组:`Params`、`Header`、`Body`。动作参数中的上下文引用使用完整路径,例如 `Params.orderId`、`Header.Authorization`、`Body.customer.name`;不要把它们写成 `FormData.*`。
60
+
61
+ 生成前 CLI 会使用当前会话调用 `openApplicationBrowser` 完成接口,并把返回的应用归一化为 `{ "id": <应用ID>, "content": "<应用名称>" }` 写入 `authAppIds`。默认使用接口返回的全部应用;如需限定范围,可在语义计划中传 `authAppNames: ["普通应用-wull"]`。认证应用为空时 Java 组件仍可保存,但请求可能无法通过开放平台认证。
62
+
63
+ ## 终止节点响应
64
+
65
+ Webhook 触发的终止节点使用 `finalOutput.params.webhookCustomParamSetting`,对应前端 `ParamGroupMappingBean`。必须包含 `Header`、`Body`、`StatusCode` 三个分组,并至少配置一个 Header 或 Body 字段;平台原生的 `id`、`mappingId`、`primaryKey`、`mappingTableId`、`customData` 和 `tableData` 直接保留。
66
+
67
+ ```json
68
+ {
69
+ "finalOutput": {
70
+ "params": {
71
+ "webhookCustomParamSetting": {
72
+ "id": "response-setting-1",
73
+ "mappingId": "response-mapping-1",
74
+ "tables": [
75
+ { "name": "Header", "tableData": [] },
76
+ { "name": "StatusCode", "tableData": [] },
77
+ {
78
+ "name": "Body",
79
+ "customData": "{\"dataType\":\"application/json\"}",
80
+ "tableData": [
81
+ { "id": "response-a", "paramKey": "ab", "paramName": "ab", "paramType": "string", "required": true }
82
+ ]
83
+ }
84
+ ]
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ```
@@ -12,14 +12,14 @@
12
12
  | HTTP 请求参数 | `Http.inputParams.formulaData` | 固定值、上下文、系统变量、变量、常量、函数/公式 | 写入接口详情对应参数行的 FormulaBean,不改写接口参数定义 |
13
13
  | MQ 发送参数 | `InnerMQSend.queueName`、`inputParams` | 固定值、上下文、系统变量、变量、常量、查询结果、函数/公式 | 保留原生 `sendParams` 参数定义,只向命中的参数行写入 `formulaData` |
14
14
  | DML SQL 参数 | `DMLExecute.fieldSet.assign` | 固定值、上下文、系统变量、变量、常量、查询结果、函数/公式 | 按 SQL 占位符生成 FormulaBean 数组,同时保留原生 FormulaBean 兼容入口 |
15
- | 消息模板 | `SendMessage.title/content.parts` | 上下文、系统变量、变量、常量 | 消息正文占位符与独立绑定;接收人上下文也保留为动态人员 FormulaBean |
15
+ | 消息模板 | `SendMessage.msgTitlev/msgContentv/picLink/msgPcLink/msgMobileLink` | 上下文、系统变量、变量、常量、函数/公式、查询结果 | 五个消息文本/链接字段统一保存为 `ContestSettingDTO`;正文占位符与独立绑定;接收人上下文仍保留为动态人员 FormulaBean |
16
16
  | 消息接收人 | `SendMessage.receiver` | 当前用户、上游人员上下文、固定人员 | 动态人员使用真实上下文 `paramKey`,固定人员使用当前租户 Browser 对象 |
17
17
  | 人员参数 | 表单数据动作、流程动作、文档动作、`HrmEmployeeUpdate`、`PersonnelOnboarding`、`AlterPersonStatus`、会议/日程中的人员属性 | 当前用户、上游人员上下文、动作流变量/常量/函数 | 不再强制走固定人员查询;动态引用保持人员 FormulaBean,固定人员仍要求真实 Browser 对象 |
18
18
  | 会议和日程运行时字段 | `MeetingCreate` 的标题/密级/人员,`ScheduleCreate` 的标题/时间/内容/其他地点/人员 | 上下文、系统变量、变量、常量、函数/公式 | 普通字段生成对应 FormulaBean;人员使用人员 FormulaBean;会议室、日程类型、关联流程等设计期资源仍保持 Browser 对象 |
19
19
  | 流程和文档运行时字段 | 流程实例 ID、标题、意见、公文正文 ID、关联数据 ID、时间、文档/附件 ID、布尔开关等 `formula_or_reference` 属性 | 固定值、上下文、系统变量、变量、常量、查询结果、函数/公式 | 统一经共享公式编译器生成 FormulaBean;固定流程定义、节点、目录 DTO 不在此列 |
20
20
  | 循环参数 | `MultipleExecution.cycleTimes`、列表/明细来源 | 上下文、变量、常量、当前循环上下文 | 按循环模式生成对应 `CycleParams`/FormulaBean |
21
21
  | 条件右值 | `Condition` | 固定值、上下文、系统变量、变量、常量、函数 | 右值保留为公式树,不把动态字段名转成固定字符串 |
22
- | 终止节点动态输出 | `finalOutput.params.reminderMsgFormula`、`basisValue` | 固定值、上下文、系统变量、变量、常量、查询结果、函数/公式 | 自动补充的 `Output` 节点保留高级设置,无需在 `actions` 中手写终止节点 |
22
+ | 终止节点动态输出 | `finalOutput.params.reminderContent`、`basisValue` | 富文本 `ContestSettingDTO`;提醒内容支持文本、上下文、系统变量、变量、常量、查询结果、函数/公式 | 自动补充的 `Output` 节点保留高级设置,无需在 `actions` 中手写终止节点;旧 `reminderMsgFormula` 不再用于新生成 |
23
23
 
24
24
  ## 需要按组件协议单独判定
25
25
 
@@ -42,7 +42,7 @@
42
42
  | `e10-cli app read <appId>` | 查看应用**详情**(全量配置:名称/描述/简称/范围/目录/组织/发布状态)。`--json` 输出完整对象。走 `/app/info` |
43
43
  | `e10-cli app edit <appId> [--name] [--desc] [--short-name]` | 编辑应用信息(至少指定一个写参数;内部先读 `/app/info` 再合并提交) |
44
44
  | `e10-cli app delete <appId>` | 删除应用(软删除,可恢复;存在关联资源会提示先清理) |
45
- | `e10-cli form read <objId> [--app-id <appId>] [--out <file>]` | 读取表单字段。`--app-id` 含明细表字段+Select/RadioBox/CheckBox 选项;`--out fields.json` 写 UTF-8 JSON(推荐,机器可读)。旧版 `[dir]` 参数写 memo.md,已过时 |
45
+ | `e10-cli form read <objId> [--app-id <appId>] [--out <file>]` | 读取表单字段。`--app-id` 含明细表字段+Select/RadioBox/CheckBox 选项、**并标注每个字段属于哪张物理表**(`· 物理表: 表1`,JSON 里是 `formTable` 键;多物理表见 `form physical-table list`);`--out fields.json` 写 UTF-8 JSON(推荐,机器可读)。旧版 `[dir]` 参数写 memo.md,已过时 |
46
46
  | `e10-cli form read <objId> --app-id <appId> --out fields.json` | 读取字段含选项(Select/RadioBox/CheckBox 自动带 options)。**含明细表字段**,配动作流/联动拿明细 fieldId 用这个 |
47
47
  | `e10-cli form list <appId>` | 列出应用下的所有表单 |
48
48
  | `e10-cli form create <appId> <name> <dir> --fields @<json文件>` | 创建表单。`--fields` **必填**。支持 DetailTable(嵌套formFields)、EBuilder(sformId+dataTitle)、relateFrom(联动)。fields.json 字段可带 `"required":true`/`"readOnly":true` 直标(写进布局 comps)。**字段名与平台系统字段重名(标题/创建者/创建时间/数据ID/最后更新人/数据状态)→ 不新建物理字段、复用系统字段**,并把该字段在**布局置为可见**(platform 系统字段默认隐藏;可写 `"singleRow":true` 独占一行、`"hidden":true` 保持隐藏)。`--json` 返回 `skippedSys`。**默认不加菜单**,要入口传 `--menu`(台账菜单 VIEWPORT);漏加 `e10-cli menu add-table <appId> <objId>` 补。**`--table-name <名>` 自定义数据库表名**(平台前缀如 `uf_` 由 CLI 自动补,传 `cs_khxx` 与 `uf_cs_khxx` 等价;字母开头、只含字母数字下划线;自定义部分受平台长度上限约束——`uf_` + 总长 30 时最多 27 位,越界直接报错不建半张表;建成后回读校验实际表名;仅物理表应用适用) |
@@ -80,6 +80,11 @@
80
80
  | `e10-cli form validate list <objId> <appId>` | 查看表单**查重规则**(字段重复校验,多字段 AND)。`add <objId> <appId> <字段名...> [--help 提示] [--remind]` 新增(缺省禁止提交 NOSUBMISSION,`--remind` 仅提醒)。**`--help` 会建成多语言标签、存的是标签 id**(平台只收 id,传文本会被拒「提示内容格式不正确」;`list` 会解回文本显示,缓存原因刚建完约 10 秒内可能仍显示 id);`delete <objId> <appId> <ruleId>` 删除。项目名称重名/工时日期重复不允许 |
81
81
  | `e10-cli form add-detail-table <objId> <appId> <明细表名> [首字段名] [--init]` | 给**已存在的主表**加明细子表(saveSubForm 建子表 + 加首字段使其可见)。`--data-key <物理表名>`、`--first-field-type <类型>`(默认 Text)。⚠ **空子表平台会过滤掉、布局里看不见**,首字段名强烈建议传;`--init` 建完把 DetailTable 组件放进布局。后续往明细里加字段用 `form add-field --sub-form-id <subFormId>`:建表时一次性带明细用 `form create` 的 fields.json `DetailTable`+`formFields` |
82
82
  | `e10-cli form delete-detail-table <objId> <appId> <subFormId\|明细表名>` | **删除明细表**(连带表里的字段)。平台不允许删**仍被布局引用**的明细表(报「当前【X】明细表已被布局引用,不允许删除」)—— 明细表只要在表单上就必然被引用,所以多数情况要加 `--force`:先把这张表的组件(本体 + 每列的「字段本体 + 标题标签」)从布局摘掉、清掉 workbook 里的残留,再删。删除是**软删**,记录仍在但不再算数 |
83
+ | `e10-cli form physical-table list <objId> <appId>` | 列出表单的**全部物理表**(含主表),带 `formTableId` / 显示名 / 库表名 / 表类型(`MAIN`\|`SUBSIDIARY`) / 字段数。走 `getFormAGroupList`(设计器「字段管理」那排 chip 的数据源)。**只列物理表**,明细表要用 `form detail-table list` |
84
+ | `e10-cli form add-physical-table <objId> <appId> --name <名> --table-name <uf_xxx>` | 给**已存在的表单**加一张**附属物理表**(设计器「字段管理 → **其他**」页签,用于一个表单的字段分散到多张物理表、字段数过多时的容量兜底)。走 `saveFormTable`,`tableType=SUBSIDIARY`;输出 **`formTableId`**(后续加字段/改名/删除都要用它,忘了用 `form physical-table list` 找)。`--table-name` **必填**(平台的建议命名规则未抓到报文,不猜)。⚠ 与明细表是两根轴,别混 —— 见 `references/form/guide-form-physical-table.md` |
85
+ | `e10-cli form add-physical-field <objId> <appId> <formTableId> <字段名> <类型> [标题]` | 往**已有的附属物理表**里加字段。机制是 `saveFormFieldNew` + jsonObj 里的 `formTableId`(**不是**批量端点)。选项与 `form add-field` 同名同义,**两者共用同一份字段构造器**。⚠ **不碰布局** —— 字段不会自动进表单布局。每次写完**回读确认**(平台对形状不认的字段会回 200 却静默不落库) |
86
+ | `e10-cli form rename-physical-table <objId> <appId> <formTableId> --name <新名> --table-name <原表名>` | 改物理表**显示名**(同一个 `saveFormTable` 端点,带 `formTable.id` 即改名)。`--table-name` 要**原样回传** |
87
+ | `e10-cli form delete-physical-table <objId> <appId> <formTableId...>` | 删除物理表(`deleteFormTable`,可一次删多张)。⚠ **表里的字段一并删除,不可逆**。表 id 用 `form physical-table list` 查 |
83
88
  | `e10-cli form list-search <objId> <appId> <listId> [--add <fieldId...>] [--quick <fieldId...>] [--remove <fieldId>] [--pc-only]` | 查看/配置台账**搜索条件**。`--add` 进搜索面板、`--quick` 加顶部快捷筛选(均支持多字段)、`--remove` 移除。主表字段直取 ds/fields;明细子字段自动 fallback `getFormField` 单取元数据。**自动保留移动端配置** |
84
89
  | `e10-cli form list-sort <objId> <appId> <listId> [--field <fieldId...>] [--order ASC\|DESC] [--clear] [--pc-only]` | 查看/配置台账**排序**。`--field` 支持多个(按传入顺序多级排序,`--order` 对所有字段生效)、`--clear` 清除。**自动保留移动端配置** |
85
90
  | `e10-cli form list-stats <objId> <appId> <listId> [--add <json或@文件>] [--remove <statId>] [--pc-only]` | 主表/明细顶部统计,sum/count/avg/max/min、条件及格式;明细 count 支持 `{ "type":"count", "subFormId":"..." }`。保存后回读、保护移动端;平台可能共享两端统计,输出 mobileStatistics。详见 `references/form/guide-list-stats.md` |
@@ -100,7 +105,9 @@
100
105
  | `e10-cli form layout init <objId> [--style-template <名\|id>] [--view-id <id>] [--read-only] [--required] [--disable-edit] [--single-row]` | 初始化/重建表单布局(initLayout):**换样式模板** + 覆盖字段 readOnly/required/disableEdit/singleRow(不传这些开关则**保留字段已有设置**)。**⚠ 样式模板流式与表格式是两套**,同名不同 id,按表单实际布局类型实时查(传错套会直接报错并列出可用项;**平台对跨套 id 不报错、只会静默忽略,表现为"命令成功但样式没变"**)。缺省:流式=标准版、表格式=表格版。完整模板表见 `form/style-templates.md`。**建表时不能指定样式,只能建完再用本命令换** |
101
106
  | `e10-cli form group <objId> <appId> --groups '{"基本信息":["字段名/fieldId",...]}'` | 给**已建好的 eb 表**加字段分组(折叠容器)。建组 saveFieldGroup → 分配 updateFormFieldGroup → initLayout generateCollapse 渲染。`--groups` 可 `@文件`;`--required` 同时设分组内字段必填;同名分组复用不重复建(去重)。建表时一次性带分组用 `form create` 的 fields.json `group` 属性 |
102
107
  | `e10-cli form data add <objId> <appId> <json>` | 写入表单数据(`@` 开头为 JSON 文件路径)。JSON key 可用 fieldId 或字段名;Select/RadioBox 值填选项名(自动解析 valueKey)或 valueKey、CheckBox/SelectMultiple 用数组、TextArea 直接值、Employee/Department 用 ID。详见 `form/guide-form-data.md` |
103
- | `e10-cli form data list <objId> [--page <n>] [--size <n>]` | 查询表单数据。`--page` 页码(缺省1)、`--size` 每页条数(缺省1000;不传 pageInfo 平台默认卡 10) |
108
+ | `e10-cli form data list <objId> [--page <n>] [--size <n>]` | 查询表单数据(**只含主表**)。`--page` 页码(缺省1)、`--size` 每页条数(缺省1000;不传 pageInfo 平台默认卡 10) |
109
+ | `e10-cli form data detail <objId> <appId> <dataId> [--no-detail]` | 读一条数据详情,**默认连明细一起读**(`--no-detail` 只要主表)。要明细用这条,`list` 不返回明细。详见 `form/guide-form-data.md` |
110
+ | `e10-cli form data update <objId> <appId> <dataId> <json> [--detail-mode cover\|append]` | 按数据 ID 修改(`@` 开头为文件路径)。只需写要改的字段;带明细表名即处理明细,缺省 `cover` **整表覆盖**,`append` 只追加 |
104
111
  | `e10-cli form data delete <objId> <dataId>` | 删除一条表单数据 |
105
112
 
106
113
  ### 表单按钮
@@ -164,7 +171,8 @@
164
171
  | `e10-cli org department edit <id> [--name] [--code] [--parent] [--disporder]` | 编辑部门:改名 / 改编号 / **移动父级** / 改排序。是「**读现状 → 改 → 写回**」:`organization/getForm?id=` 读回这个部门的**完整当前状态**(含 tenantKey / creator / datarank / createTime 等,全部原样回传,别自己造),改完再 `organization/saveForm`。⚠ 编辑报文与新建**形状不同**(认 `id`,没有 `targetId`/`formdata`/`recordId`,`advanceForm:false`),不能共用构造函数。命令会自动**回读确认**改名生效,静默失败会报错 |
165
172
  | `e10-cli org department delete <id> [--parent <父部门id>] [--subcompany <机构id>]` | 删除部门。`--parent` 是该部门的**父**(顶层部门的父就是机构 id),不传按当前机构的上下文解析。⚠ 删除是**软删**(`isDelete: true`),删完用 `getForm?id=` 仍能读出来 —— 判存在与否要看 `isDelete` 字段,别看接口有没有返回 |
166
173
  | `e10-cli org employee template [--out <路径>]` | 导出人员导入模板(xlsx)。**模板是随包发的资源**(含富文本表头和「注意事项」工作表),直接复制,不用代码重建 |
167
- | `e10-cli org employee import <file> [--dry-run] [--mode add\|update] [--find-by <字段>] [--review <n>]` | 从 Excel 批量导入人员。**先 `--dry-run` 预览再真导** —— 干跑到「预览」为止不落库,能看出平台解析出的列/行跟你原表对不对。⚠ 模板自带示例行,导入前删掉。细节见 `references/hrm/guide-org-employee.md` |
174
+ | `e10-cli org employee import <file> [--dry-run] [--mode add\|update] [--find-by <字段>] [--review <n>] [--no-wait] [--wait-timeout <ms>] [--error-file <路径>] [--no-error-file]` | 从 Excel 批量导入人员。**先 `--dry-run` 预览再真导** —— 干跑到「预览」为止不落库,能看出平台解析出的列/行跟你原表对不对。⚠ 模板自带示例行,导入前删掉。导完**默认等结果**,打出 `已导入 N / 失败 M`,**有失败行时退出码非 0**;失败原因(在出错单元格的批注里)会直接打出来,失败数据默认可存成 `<源文件>.错误数据.xlsx`。⚠ **分部名写错不报错**:平台会静默新建一个同名分部再把人放进去。细节见 `references/hrm/guide-org-employee.md` |
175
+ | `e10-cli org employee task <taskId> [--error-file <路径>]` | 查人员导入任务的结果(`getByTaskId`)。导入时用了 `--no-wait`、或等超时了,用这个补看:条数 / 失败原因 / 失败数据。⚠ **`status: 0` 不是成功**,判完成看 `callbackData` |
168
176
 
169
177
  ## 流程
170
178
 
@@ -48,7 +48,7 @@ e10-cli form association create <objId> <appId> "全部合同" --view <viewId> -
48
48
 
49
49
  每项含义为“目标视图字段 ← 当前来源记录字段”。支持字段 ID 或唯一显示名称,自动补全 `compType/fieldName/dataIndex` 等元数据。仅支持主表字段到主表字段的映射;明细字段及固定值筛选不在本次支持范围。
50
50
 
51
- 上例复现样本中的配置,不代表所有关联字段都应传名称。目标 EBuilder 字段可能需要记录 ID:应按业务语义选择 `sourceField: "数据ID"` 或指定字段,并用实际记录确认筛选结果。命令不会擅自把用户提供的名称字段改成 ID。
51
+ 上例样本中的配置,不代表所有关联字段都应传名称。目标 EBuilder 字段可能需要记录 ID:应按业务语义选择 `sourceField: "数据ID"` 或指定字段,并用实际记录确认筛选结果。命令不会擅自把用户提供的名称字段改成 ID。
52
52
 
53
53
  默认启用,默认适用于 PC 和 MOBILE,默认仅显示布局。省略 `--mappings` 表示不添加关联参数;目标视图自身的筛选仍独立生效。创建检测同名页签,重复时停止,改用 `update`。
54
54
 
@@ -41,6 +41,36 @@ data.json 格式(`@` 开头为文件路径)。key 可用 **fieldId(长 ID
41
41
 
42
42
  > **除非用户明确要求,否则不要往表单写入任何数据。** 表单创建完成后只需确认字段正确即可,不要自动插入测试数据。
43
43
 
44
+ ## 读明细:`detail`
45
+
46
+ `list` 只返回主表。要**连明细一起读**用 `detail`:
47
+
48
+ ```bash
49
+ e10-cli form data detail <objId> <appId> <dataId> [--no-detail]
50
+ ```
51
+
52
+ 输出主表字段(按显示名)与各明细表的行。`--no-detail` 表示只要主表。
53
+
54
+ ## 改数据:`update`
55
+
56
+ ```bash
57
+ e10-cli form data update <objId> <appId> <dataId> @patch.json [--detail-mode cover|append]
58
+ ```
59
+
60
+ `@patch.json` 的写法和 `add` 一样(key 用字段名),**只需写要改的字段**。带明细表名即处理明细:
61
+
62
+ ```json
63
+ { "金额": 1200, "物料明细": [ { "物料名称": "螺丝", "数量": 100 } ] }
64
+ ```
65
+
66
+ - `--detail-mode cover`(缺省):**整表覆盖**该明细的行 —— 写几行就是几行,原来的行被替换
67
+ - `--detail-mode append`:只追加,原有明细行保留
68
+
69
+ 不传明细表名时,明细原样不动。
70
+
71
+ > `add` 走设计器那条保存链(`form/core/saveFormData`,**一次一条、只写主表**);
72
+ > `update` 与 `detail` 走表单数据 OpenAPI。
73
+
44
74
  ## 删数据
45
75
 
46
76
  ```bash
@@ -14,6 +14,12 @@
14
14
 
15
15
  明细字段也在同一个平铺数组里,靠 `config.subFormId` 归属;它的 `excel.parent` 指向明细表容器的 `nodeId`,普通字段的 `excel.parent` 是 `ROOT`。
16
16
 
17
+ **EXCEL 布局还有第三份:网格。** `pageLayouts[].config.workbook.Sheet1.cells` 里每个组件占**一格**,靠 `style.cellType.comId` 认到自己的组件,位置也以格子自己的 `row` / `col` 为准 —— **设计器按网格渲染**。所以 EXCEL 表里「组件的 `config.excel.row` / `col`」和「格子的 `row` / `col`」是同一件事的两份副本,**改一份必须改两份**:只改组件层的话接口会回成功,但设计器里画不出来。
18
+
19
+ FLOW 布局**没有** `config.workbook`(它靠 `config.flow.parent` / `nodes` 排布),这条对它不适用。
20
+
21
+ > 这份同步由 CLI 负责,不用手工做。但**手工在页面上改过布局的老表**如果在 EXCEL 上有字段显示不出来,在设计器里保存一次即可 —— 设计器会按组件重算网格。
22
+
17
23
  ## 字段属性分两类
18
24
 
19
25
  有些属性**只存在于布局组件里,字段定义没有这个键** —— 只写字段定义等于什么都没做:接口回成功、命令也报成功,表单上一点变化都没有。
@@ -37,11 +43,20 @@
37
43
 
38
44
  **不是自己建的表不要用 `--reinit`。** 字段越多越经不起 —— 真实的一张订单主表有 131 个组件。
39
45
 
40
- ### 什么时候加字段会中止
46
+ ### 表里还没有这个类型时:用平台给的字段模板
47
+
48
+ 新组件的键集(`format`、`earlyDate`、`pointSize`、`switchType` …)各类型都不一样,**按类型名拼一个出来只会猜错,而猜错不报错、只是渲染异常**。所以增量插入一向是**照同类型的现成组件整套抄**。
49
+
50
+ 表里没有同类型字段时,模板改从平台取:命令会调 `getFormFieldExist`,拿**平台按这个字段生成的组件模板**(`configPC`)—— 顶层样式键(按类型)与类型专有键平台都给全了,结构尾键从同作用域的现成组件借,位置和身份键由命令自己写。**全程不重建布局。**
51
+
52
+ 两点要知道:
53
+
54
+ - 明细表字段拿不到这个接口的模板(它只返回主表与系统字段),但模板是**按类型而不是按作用域**的,此时借主表同类型的那一份。
55
+ - 拿模板只在**真的缺**时才多打一次接口;表里已有同类型字段时,路径与从前一字不差。
41
56
 
42
- 布局里**没有同类型的字段可参照**时,命令会中止并说明。
57
+ ### 明细表的字段是横着排的
43
58
 
44
- 这是设计如此,不是缺陷:新组件的键集(`format`、`earlyDate`、`pointSize`、`showDimension` …)各类型都不一样,只能从同类型的现成组件整套抄过来;按类型名拼一个出来,**猜错不报错、只是渲染异常**。
59
+ 同一个「加字段」,**主表和明细表落的轴不一样**:主表是一行一个字段(新字段**往下加行**),明细表是一个字段占一列(新字段**往右加列**)。明细表还有自己的一张网格(`workbook` 的键就是 `DetailTable` 组件的 id),明细字段的格子在那张里,不在 `Sheet1`。
45
60
 
46
61
  遇到中止时,两个选择:
47
62
 
@@ -48,7 +48,7 @@ e10-cli form linkage add <appId> <objId> <name> --config @<json文件>
48
48
  | fieldType | 字段类型,如 `Text` / `Employee` / `Date` |
49
49
  | **`isDetail`** | **目标落在明细表里时必须为 `true`**。不传 = 主表字段 |
50
50
 
51
- **目标字段在明细表里,就加 `"isDetail": true`** —— 这是「主表字段控制明细列显隐」的写法,两个方向都支持(实测 `hide` / `required` 均可):
51
+ **目标字段在明细表里,就加 `"isDetail": true`** —— 这是「主表字段控制明细列显隐」的写法,两个方向都支持(`hide` / `required` 均可):
52
52
 
53
53
  ```json
54
54
  {
@@ -105,7 +105,7 @@ e10-cli form linkage add <appId> <objId> <name> --config @<json文件>
105
105
  | `"effect": "formLayout"` | 只对**某个表单布局**生效(布局 id 现查) |
106
106
  | `"effect": { ... }` | 直接给 `{effectType, effectName, effectValue}`,自行指定 |
107
107
 
108
- ⚠ **布局维度的值要的是 `multipleLayoutId`,不是 `formLayout.id`** —— 同一张表上这两个值**相邻但不同**(实测某表是 `…375` 与 `…376`)。给错了命令**不报错**,只是指向另一个布局,而且平台按这个 id 解析不出名字,回读时生效范围是个空白(`表单布局: `)。命令取的是前者,不用手填。
108
+ ⚠ **布局维度的值要的是 `multipleLayoutId`,不是 `formLayout.id`** —— 同一张表上这两个值**相邻但不同**(例如 `…375` 与 `…376`)。给错了命令**不报错**,只是指向另一个布局,而且平台按这个 id 解析不出名字,回读时生效范围是个空白(`表单布局: `)。命令取的是前者,不用手填。
109
109
 
110
110
  ### 工作流表单那条路由的维度不一样
111
111