weaver-e10-builder 1.2.5 → 1.5.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 (201) hide show
  1. package/assets/org-employee-template.xlsx +0 -0
  2. package/dist/commands/form-button.d.ts.map +1 -1
  3. package/dist/commands/form-button.js +28 -5
  4. package/dist/commands/form-button.js.map +1 -1
  5. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  6. package/dist/commands/form-field-linkage.js +27 -6
  7. package/dist/commands/form-field-linkage.js.map +1 -1
  8. package/dist/commands/form-formula-linkage.d.ts +3 -0
  9. package/dist/commands/form-formula-linkage.d.ts.map +1 -0
  10. package/dist/commands/form-formula-linkage.js +434 -0
  11. package/dist/commands/form-formula-linkage.js.map +1 -0
  12. package/dist/commands/form-formula.d.ts.map +1 -1
  13. package/dist/commands/form-formula.js +22 -3
  14. package/dist/commands/form-formula.js.map +1 -1
  15. package/dist/commands/form-list-click.d.ts.map +1 -1
  16. package/dist/commands/form-list-click.js +2 -1
  17. package/dist/commands/form-list-click.js.map +1 -1
  18. package/dist/commands/form-native.d.ts.map +1 -1
  19. package/dist/commands/form-native.js +11 -3
  20. package/dist/commands/form-native.js.map +1 -1
  21. package/dist/commands/form.d.ts.map +1 -1
  22. package/dist/commands/form.js +247 -173
  23. package/dist/commands/form.js.map +1 -1
  24. package/dist/commands/matrix.d.ts.map +1 -1
  25. package/dist/commands/matrix.js +175 -36
  26. package/dist/commands/matrix.js.map +1 -1
  27. package/dist/commands/org.d.ts +10 -0
  28. package/dist/commands/org.d.ts.map +1 -0
  29. package/dist/commands/org.js +278 -0
  30. package/dist/commands/org.js.map +1 -0
  31. package/dist/commands/role.d.ts.map +1 -1
  32. package/dist/commands/role.js +106 -62
  33. package/dist/commands/role.js.map +1 -1
  34. package/dist/commands/wf-form.d.ts.map +1 -1
  35. package/dist/commands/wf-form.js +501 -26
  36. package/dist/commands/wf-form.js.map +1 -1
  37. package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
  38. package/dist/commands/workflow-auth-resp.js +53 -5
  39. package/dist/commands/workflow-auth-resp.js.map +1 -1
  40. package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -1
  41. package/dist/commands/workflow-create-auth-resp.js +5 -1
  42. package/dist/commands/workflow-create-auth-resp.js.map +1 -1
  43. package/dist/commands/workflow.d.ts.map +1 -1
  44. package/dist/commands/workflow.js +78 -9
  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/action-detail.d.ts.map +1 -1
  49. package/dist/services/action-detail.js +5 -4
  50. package/dist/services/action-detail.js.map +1 -1
  51. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  52. package/dist/services/actionflow/components/action_eb_update_compiler.js +22 -7
  53. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  54. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  55. package/dist/services/actionflow/components/approve_create.js +6 -3
  56. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  57. package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/custom_set_form.js +35 -1
  59. package/dist/services/actionflow/components/custom_set_form.js.map +1 -1
  60. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
  61. package/dist/services/actionflow/components/custom_trigger.js +4 -1
  62. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  63. package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/dml_execute.js +7 -3
  65. package/dist/services/actionflow/components/dml_execute.js.map +1 -1
  66. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  67. package/dist/services/actionflow/components/document_actions.js +7 -3
  68. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  69. package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
  70. package/dist/services/actionflow/components/hrm_actions.js +7 -3
  71. package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
  72. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  73. package/dist/services/actionflow/components/multiple_execution.js +14 -5
  74. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  75. package/dist/services/actionflow/components/output.js +1 -1
  76. package/dist/services/actionflow/components/output.js.map +1 -1
  77. package/dist/services/actionflow/components/send_message.js +2 -2
  78. package/dist/services/actionflow/components/send_message.js.map +1 -1
  79. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  80. package/dist/services/actionflow/components/workflow_actions.js +7 -3
  81. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  82. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  83. package/dist/services/actionflow/context_preflight.js +12 -2
  84. package/dist/services/actionflow/context_preflight.js.map +1 -1
  85. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  86. package/dist/services/actionflow/context_provider.js +21 -2
  87. package/dist/services/actionflow/context_provider.js.map +1 -1
  88. package/dist/services/actionflow/custom_trigger_context.d.ts +10 -0
  89. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -0
  90. package/dist/services/actionflow/custom_trigger_context.js +46 -0
  91. package/dist/services/actionflow/custom_trigger_context.js.map +1 -0
  92. package/dist/services/actionflow/filter_rules.js +2 -2
  93. package/dist/services/actionflow/filter_rules.js.map +1 -1
  94. package/dist/services/actionflow/formula_service.d.ts +9 -1
  95. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  96. package/dist/services/actionflow/formula_service.js +59 -21
  97. package/dist/services/actionflow/formula_service.js.map +1 -1
  98. package/dist/services/actionflow/id_generator.d.ts +2 -0
  99. package/dist/services/actionflow/id_generator.d.ts.map +1 -1
  100. package/dist/services/actionflow/id_generator.js +13 -0
  101. package/dist/services/actionflow/id_generator.js.map +1 -1
  102. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  103. package/dist/services/actionflow/preflight_service.js +6 -1
  104. package/dist/services/actionflow/preflight_service.js.map +1 -1
  105. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  106. package/dist/services/actionflow/workflow_compiler.js +89 -35
  107. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  108. package/dist/services/auth-resp-condition.d.ts +35 -0
  109. package/dist/services/auth-resp-condition.d.ts.map +1 -0
  110. package/dist/services/auth-resp-condition.js +111 -0
  111. package/dist/services/auth-resp-condition.js.map +1 -0
  112. package/dist/services/condition-rules.d.ts.map +1 -1
  113. package/dist/services/condition-rules.js +4 -1
  114. package/dist/services/condition-rules.js.map +1 -1
  115. package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
  116. package/dist/services/esb-interface/document-parser.js +62 -5
  117. package/dist/services/esb-interface/document-parser.js.map +1 -1
  118. package/dist/services/form-association.d.ts +19 -0
  119. package/dist/services/form-association.d.ts.map +1 -1
  120. package/dist/services/form-association.js +64 -0
  121. package/dist/services/form-association.js.map +1 -1
  122. package/dist/services/form-button-action.d.ts +7 -0
  123. package/dist/services/form-button-action.d.ts.map +1 -1
  124. package/dist/services/form-button-action.js +11 -1
  125. package/dist/services/form-button-action.js.map +1 -1
  126. package/dist/services/form-create.d.ts +4 -0
  127. package/dist/services/form-create.d.ts.map +1 -1
  128. package/dist/services/form-create.js +18 -12
  129. package/dist/services/form-create.js.map +1 -1
  130. package/dist/services/form-field-patch.d.ts +3 -1
  131. package/dist/services/form-field-patch.d.ts.map +1 -1
  132. package/dist/services/form-field-patch.js +23 -9
  133. package/dist/services/form-field-patch.js.map +1 -1
  134. package/dist/services/form-formula-linkage.d.ts +349 -0
  135. package/dist/services/form-formula-linkage.d.ts.map +1 -0
  136. package/dist/services/form-formula-linkage.js +546 -0
  137. package/dist/services/form-formula-linkage.js.map +1 -0
  138. package/dist/services/form-layout-insert.d.ts +84 -0
  139. package/dist/services/form-layout-insert.d.ts.map +1 -0
  140. package/dist/services/form-layout-insert.js +244 -0
  141. package/dist/services/form-layout-insert.js.map +1 -0
  142. package/dist/services/form-linkage-condition.d.ts +159 -0
  143. package/dist/services/form-linkage-condition.d.ts.map +1 -0
  144. package/dist/services/form-linkage-condition.js +307 -0
  145. package/dist/services/form-linkage-condition.js.map +1 -0
  146. package/dist/services/formula-detail.d.ts +98 -6
  147. package/dist/services/formula-detail.d.ts.map +1 -1
  148. package/dist/services/formula-detail.js +208 -26
  149. package/dist/services/formula-detail.js.map +1 -1
  150. package/dist/services/matrix-rows.d.ts +43 -0
  151. package/dist/services/matrix-rows.d.ts.map +1 -0
  152. package/dist/services/matrix-rows.js +104 -0
  153. package/dist/services/matrix-rows.js.map +1 -0
  154. package/dist/services/org-department.d.ts +114 -0
  155. package/dist/services/org-department.d.ts.map +1 -0
  156. package/dist/services/org-department.js +209 -0
  157. package/dist/services/org-department.js.map +1 -0
  158. package/dist/services/org-employee.d.ts +87 -0
  159. package/dist/services/org-employee.d.ts.map +1 -0
  160. package/dist/services/org-employee.js +219 -0
  161. package/dist/services/org-employee.js.map +1 -0
  162. package/dist/services/role-member.d.ts +99 -0
  163. package/dist/services/role-member.d.ts.map +1 -0
  164. package/dist/services/role-member.js +206 -0
  165. package/dist/services/role-member.js.map +1 -0
  166. package/dist/services/workflow-info.d.ts +83 -0
  167. package/dist/services/workflow-info.d.ts.map +1 -0
  168. package/dist/services/workflow-info.js +97 -0
  169. package/dist/services/workflow-info.js.map +1 -0
  170. package/dist/services/workflow-odoc-setting.d.ts +1 -1
  171. package/dist/services/workflow-odoc-setting.d.ts.map +1 -1
  172. package/dist/services/workflow-odoc-setting.js +15 -6
  173. package/dist/services/workflow-odoc-setting.js.map +1 -1
  174. package/dist/utils/column-name.d.ts +24 -0
  175. package/dist/utils/column-name.d.ts.map +1 -1
  176. package/dist/utils/column-name.js +16 -0
  177. package/dist/utils/column-name.js.map +1 -1
  178. package/ecodecmd/package.json +1 -2
  179. package/ecodecmd/src/loaddep.js +19 -9
  180. package/package.json +4 -4
  181. package/skill-docs/SKILL.md +13 -9
  182. package/skill-docs/_catalog.md +85 -81
  183. package/skill-docs/actionflows/SKILL.md +173 -170
  184. package/skill-docs/actionflows/references/components/logic/Output.md +1 -1
  185. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +32 -0
  186. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  187. package/skill-docs/references/common/guide-plan-template.md +9 -3
  188. package/skill-docs/references/common/ref-cli-commands.md +47 -22
  189. package/skill-docs/references/esb-interface/guide-import.md +4 -1
  190. package/skill-docs/references/form/guide-create-form.md +13 -0
  191. package/skill-docs/references/form/guide-field-linkage.md +2 -0
  192. package/skill-docs/references/form/guide-form-formula-functions.md +36 -0
  193. package/skill-docs/references/form/guide-form-layout-incremental.md +75 -0
  194. package/skill-docs/references/form/guide-form-linkage.md +61 -3
  195. package/skill-docs/references/form/guide-formula-linkage.md +250 -0
  196. package/skill-docs/references/form/ref-form-fields.md +6 -0
  197. package/skill-docs/references/hrm/guide-matrix.md +79 -16
  198. package/skill-docs/references/hrm/guide-org-employee.md +56 -0
  199. package/skill-docs/references/workflow/guide-workflow-auth-resp.md +48 -22
  200. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +248 -0
  201. package/skill-docs/references/workflow/guide-workflow-odoc.md +23 -51
@@ -1,170 +1,173 @@
1
- ---
2
- name: generating-actionflows
3
- description: "将业务需求编译为 Weaver ESB 动作流,或读取已有动作流后按原 ID 保留式修改:查询真实对象、正式保存、回读校验并返回设计器链接。运行能力来自 e10-cli 的 actionflow 命令组(复用 e10-cli 登录态)。新建默认保存并启用;仅当用户明确要求暂存时传 mode:stash。已有动作流修改走 update。"
4
- ---
5
-
6
- # Weaver 动作流生成
7
-
8
- 将需求编译为「触发器 → 动作链 → 结束」的 ESB 动作流。先发现真实平台数据,再生成;不根据名称、历史场景或示例猜测任何平台对象。
9
-
10
- 运行能力来自 `e10-cli actionflow` 命令组(已合并进 e10-cli 本体,复用其登录态,无需单独导出环境变量)。默认**保存并启用**(saveDesign saveAndStart=true);仅当用户明确要求暂存时传 `mode:"stash"` 走暂存(saveStashSnapshot)。
11
-
12
- ## 运行与维护边界
13
-
14
- - **运行模式(默认)**:只运行 `e10-cli actionflow <命令>`、读取本 Skill 的当前阶段/当前组件说明;不得读取或修改 e10-cli 源码(`packages/cli/src/services/actionflow/`)。
15
- - **维护模式**:仅在用户明确要求修复、审计或新增组件时编辑实现;修改后必须跑类型检查、测试、构建和本 Skill 校验。校验目标固定为 `skill/actionflows`:不要把上层 `skill` 或发布目录 `skill-docs` 当作这个动作流 Skill 的标准目录校验。上层入口包含 E10 包的自定义元数据(如 `author`、`category`、`version`、`display_name`),不因通用校验器不认识这些扩展字段而改写、删除或迁移它们。
16
- - 参数、默认值、动态必填、真实对象结构的唯一权威是 `e10-cli actionflow component-describe <type>`,参考文件不重复属性表。
17
- - 动态赋值必须按“组件 × 属性”判断,不能因为属性类型写着 `Browser` 或 `platform_reference` 就一律当成固定值。先读取 [`references/dynamic_capability_matrix.md`](references/dynamic_capability_matrix.md),再以当前租户 `component-describe`、上下文元数据和组件编译器实际契约为准;矩阵没有明确标记为已支持的属性不得臆造动态 DTO。
18
-
19
- ## 生成 SOP
20
-
21
- 按顺序推进;只读取当前步骤需要的信息。每个场景是独立事务。
22
-
23
- ### 1. 识别与选择
24
-
25
- 1. 拆出触发器、动作顺序、条件/循环、固定资源与动态来源。
26
- 2. 运行 `e10-cli actionflow component-list`,选择已登记组件。
27
- 3. 对每一个选中的组件运行 `e10-cli actionflow component-describe <type>`,再只读取下方目录中该组件的 Markdown。
28
- 4. 若存在多个业务选择会改变结果,或用户明确指定的资源找不到,暂停说明差异并询问;其余可查询的信息直接查询。
29
-
30
- ### 2. 发现真实数据
31
-
32
- 按 `component-describe` 的 `propertySources` 查询本次租户数据:
33
-
34
- - 流程:`e10-cli actionflow workflow-browser-list` / `workflow-search` / `workflow-nodes`。
35
- - 流程动态字段:`e10-cli actionflow workflow-context-fields`。默认每页 20 条;按需求字段名先传 `query`(例如 `{"workflowId":"<id>","query":"数据ID"}`),只使用本次返回的 `fields[].paramKey`。完整响应过大时用 `--out context.json` 落盘,禁止依赖终端截断后的片段。
36
- - e-builder(**已知表名时首选**):`e10-cli actionflow form-search '{"keyword":"<表名>"}'` 一次拿到表单 `objId` 与它所属的业务应用 `appId`。服务端是**子串模糊匹配**,同名表跨多个应用很常见(返回体里的 `完全同名` 即同名条数)—— **多于一条时必须按 `appName` 收窄再取**,不得自行挑一个:`'{"keyword":"<表名>","appName":"<应用名>"}'`。`keyword` 传 `objId` 则是精确命中,可用来由 id 反查所属应用。
37
- - **`appName` 走服务端过滤**(不是本地二次筛):应用名精确唯一才用;**同名多命中或查无此名会直接报错并列出候选**,此时改用 `appId` 指定,不要换个近似名重试。
38
- - **返回体 `total` 是服务端在该筛选下的命中总数,`hits` 可能只是其中一部分。** 默认最多返回 100 条,超出时 `truncated: true` 并给出 `omitted`(未返回条数)。**`truncated` 为真时绝不能判定「表单不存在」** —— 先按 `appName` 收窄,确需全部再传 `{"max":0}`(条数大时用 `--out <file>` 落盘)。判断是否唯一命中以 `唯一命中` 字段为准,不要自己数 `hits` 长度。
39
- - e-builder(**只知道应用、要浏览全表**):`e10-cli actionflow form-applications` → `form-list` → `form-fields`。`form-applications` 返回的业务应用 `id` 用于下一步:`e10-cli actionflow form-list '{"groupId":"<业务应用ID>"}'`;这里必须是 `groupId`,不能传 `appId`。表单字段查询才使用 `{"tableId":"<表单ID>","appId":"<业务应用ID>"}`。
40
- - 人员:`e10-cli actionflow recipient-search`。
41
- - 人员入职/更新字段:`e10-cli actionflow hrm-onboarding-fields`。
42
- - 文档状态:`e10-cli actionflow document-statuses`。
43
-
44
- 查不到真实对象、字段或前端 DTO 时,不猜测 ID 或对象结构,说明未支持字段并停止该字段的生成。
45
-
46
- ### 3. 组装语义计划
47
-
48
- 1. 写入 `event`、`actions`,条件和循环作为动作拓扑的一部分。
49
- 2. 只传 `component-describe` 声明的参数;固定值与动态值根据业务需求选择,不能为了动态而动态。
50
- 3. 语义 plan 的节点配置统一放在 `params`:`event.params`、`actions[*].params` 以及条件/循环内部节点的 `params`。`data` 仅属于平台回读/更新 DTO,不能出现在 `generate` 语义计划中;CLI 会在调用任何平台接口前拒绝该结构,并提示具体路径。
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。
53
- 6. 定时组件优先使用平台原生频率:`rate=1` 一次、`2` 按小时、`3` 按日、`4` 按周、`5` 按月,并按需提供 `cycle`、`hour`、`day`、`week`、`atWeek`、`atWeekDetail` 或 `lastWeek`;只有明确选择 `rate=6` 时才传 `cornString`。图形化频率必须提供 `startTime`。
54
- 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`。
55
- 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` 等旧写法会直接报错,绝不降级为空固定值。
56
- 9. 动态赋值可使用或新建动作流变量、租户常量:已有资源必须用真实 ID;计划新建变量写顶层 `variables[]`,新建常量写 `constantDefinitions[]`,常量分组可传 `groupPk` 或 `groupName`。变量按当前 `applicationId + sceneId` 隔离,常量按分组跨动作流复用。生成时先调用真实接口创建/解析资源,再编译为变量 `type:"7"` 或常量 `type:"5"` FormulaBean;详细格式见 `references/dynamic_resources.md`。消息 `parts` 也支持 `variable`/`constant` 动态片段。
57
- 9.1. 每个参数先分为“动态公式属性”“动态人员属性”“固定平台资源属性”三类:上下文、系统变量、变量、常量、函数/公式必须保留为 FormulaBean;动态人员必须使用真实人员字段上下文或系统变量,不得把引用里的 `id` 当人员 Browser ID 查询;工作流、文档目录、按钮、规则等平台资源只有在其组件契约明确提供动态引用时才允许动态化。生成前必须记录本次组件/属性的判定,生成后按属性检查回读结果;具体映射和验证状态见 `references/dynamic_capability_matrix.md`。
58
- 10. 自定义事件和内置 MQ 的参数必须按对应平台组件说明提供原生参数对象;`CustomTrigger.customData`、`InnerMQListener.receiveParams`、`InnerMQSend.sendParams` 不能用猜测的字段替代。若验证要求“输入参数里有字段”,必须在生成前提供至少一行真实原生参数;`tables:[]`、`tableList:[]` 或省略 `receiveParams` 只能表示无输入参数,不能作为有参数的占位。`InnerMQListener` 与 `InnerMQSend` 是动作流级互斥组件,同一计划(包括条件/循环嵌套)同时出现时,CLI 在任何平台写接口前直接报错。
59
- 11. 根触发节点的 `event.attr.icon` 必须使用平台真实图标:`CustomTrigger` 为 `Icon-N-Triggerrul`,`InnerMQListener` 为 `Icon-built-in-mq-listening-mcolor`;组件目录里的动作图标不能覆盖根触发器图标。保存后回读必须同时检查触发器图标、已声明输入参数的数量和查询字段,不能仅凭 `valid=true` / `saved=true` 判定配置正确。
60
- 12. `InnerMQSend.sendParams.tableData` 必须遵循“参数类型决定数据类型候选”的平台规则:普通非数组标量通常只有“属性”一个选项,不应伪造可下拉状态;数组或 `json/xml/xml_string` 结构化参数才按真实候选设置 `dataType`,结构化参数的下级用 `parentId` 表达,并保留父子约束。具体规则见 `references/components/message/InnerMQSend.md`。
61
-
62
- ### 4. 生成与逐场景反馈
63
-
64
- 1. 一次只运行一个 `generate`。
65
- 2. 成功保存并启用后立即返回名称、状态与 `workflowUrl`,再处理下一个场景。
66
- 3. 批量任务完成后再给汇总表;一个场景失败不阻断其他场景。
67
-
68
- ### 4.1 修改已有动作流
69
-
70
- 已有动作流必须走独立的 `update` 命令,不得把已有 `appId` 塞进 `generate`,也不得按名称猜测目标。只有在没有精确 ID 时,先用 `application-list` 查询动作流应用(不是 `form-applications` 的业务应用列表),按名称和所属业务应用核对;结果必须唯一,查不到或有歧义就请求精确 `appId`,不能自行挑一个:
71
-
72
- ```bash
73
- e10-cli actionflow update '@update-plan.json' --out update-result.json
74
- ```
75
-
76
- 修改计划必须使用以下结构:
77
-
78
- ```json
79
- {
80
- "appId": "已有动作流的精确 ID",
81
- "operations": [
82
- {"op":"edit-node", "nodeId":"原节点 ID", "patch":{"data":{"...":"..."}}},
83
- {"op":"delete-node", "nodeId":"要删除的原节点 ID"},
84
- {"op":"add-node", "parentPath":"/actions", "index":1, "node":{"type":"平台节点类型","data":{}}},
85
- {"op":"add-condition-branch", "conditionNodeId":"已有分支节点 ID", "branchName":"新增分支", "conditionDetail":{"conditionDataJson":"平台条件树 JSON"}, "branchActions":[]},
86
- {"op":"replace", "path":"/actions/0/data/...", "value":"新值"},
87
- {"op":"remove", "path":"/actions/0/data/..."}
88
- ]
89
- }
90
- ```
91
-
92
- 操作必须显式声明;`edit-node` 深合并 `patch`,原节点 `id/wId` 不允许修改;`delete-node` 会从设计树移除节点并填充 `deleteActions`;`add-node` 使用 `read-design --out` 得到的平台原生节点结构,可用 `index` 插入指定位置,自动补雪花 ID 并填充 `addIds`。`add-condition-branch` 专门新增 `otherConditionBranch`,必须提供已有 Condition 节点 ID 和包含 `conditionDataJson` 的完整条件详情;CLI 会先调用条件服务保存规则,使用返回的真实 `conditionId/mapId/conditionKey`,再保存动作流,不能手工伪造条件 ID。分支内动作可通过 `branchActions` 提供,缺少节点 ID 时 CLI 自动补 ID 并从当前租户组件目录补齐节点壳。新增执行节点必须插在终止节点之前,且同步修改终止节点的 `sources`。回读对象中的平台展示字段会先转换为 `saveDesign` 接受的写入 DTO(例如 EventButton 的 `eventButtonId` 和按钮对象),不能把回读 JSON 原样作为接口体。更新计划中的节点 ID 必须来自本次正式 `read-design`,不能复用更早版本的 ID。保存新版时平台可能为动作/出口重新分配内部 ID;回读校验优先按 ID,ID 变化时按动作树路径和类型匹配,不能因版本复制产生新 ID 就误判失败。`sources[].id` 由平台保存时动态分配/回读时可能省略,必须通过稳定的 `sources[].wId` 校验。未操作的节点和属性从正式回读原样作为保存基线,不会被新建编译器重建;新建动作流的 `assistLayer` 只写平台空骨架 `{"nodes":[],"layout":{}}`,更新已有动作流保留原生 X6 画布节点,不得伪造扁平 `{id,type,layout}` 节点,也不能把旧版本悬空节点带入新版。更新前自动备份完整正式设计到 `.actionflow-plans/backups/`;也可以传 `backupFile` 指定路径。
93
-
94
- 更新默认根据目标动作流当前状态决定 `saveAndStart`,保持启用/未启用状态;只有计划显式传 `saveAndStart` 才改变它。触发器 `event` 必须原样保留,禁止通过 `replace/remove` 修改 `/event` 或其子路径;如果要改变触发类型、触发表单、触发时机或触发器参数,必须新建动作流。正式更新固定带 `saveNewVersion:true`,保存为原动作流的新版本。保存后无论目标原本启用还是禁用,CLI 都必须调用设计器真实的 `setActiveVersion/{appId}/{newSceneId}`,再读版本列表确认 `activeVersion` 是新版本;`saveAndStart` 只控制动作流启用状态,不控制活动版本。保存响应未返回新版 ID 时,CLI 必须重新查询版本列表定位版本号更大的新场景,再对新版正式回读;定位不到新版时不能拿旧版冒充校验通过。一次 update 最多执行一次正式保存:如果已保存但激活失败、活动版本回读不一致或正式回读失败,结果必须保留 `saved/sceneId/backupFile` 证据并停止,不能自动重跑、再次新建版本、回滚或删除;需要重试时由用户确认并基于新结果重新规划。保存后必须正式回读并检查编辑、新增、删除及未修改节点是否仍在。
95
-
96
- ### 5. 回读与异常分流
97
-
98
- - 预检/编译失败:修正计划或报告缺失真实对象;不会创建动作流。
99
- - 保存并启用成功但正式回读不一致:不得宣称验证通过;根据回读定位计划或组件问题,修复后重试,旧测试流由 CLI 回收。
100
- - 保存并启用成功且正式回读通过:返回链接。
101
- - 保存失败:返回平台错误原因;不自动退回暂存。
102
- - 平台接口或前端编辑器不可用:明确区分「JSON/readBack 已验证」和「UI 待确认」。
103
-
104
- ## 流程节点触发绑定
105
-
106
- `generate` 的 event 节点(`ApproveTrigger`)自带流程节点触发绑定:单条规则用 `workflowPath`(流程 id)+ `triggerTiming`;同一流程有多个触发时机时用 `triggerRules` 数组,编译为一个 `singleApproveConfigs[workflowId]` 规则数组。节点型时机使用 `approveNode`,出口型 `link` 必须使用真实 `approveLink`;编译器逐条校验可选节点类型与执行时间,不走 pathdef/addaction。多规则需要不同后续动作时,先按触发器上下文 `triggerType` / `executeTime` / `triggerNodeOrLinkId` 放 `Condition` 分支。完整联动表见 `references/components/workflow/ApproveTrigger.md`。
107
-
108
- `generate` 默认**保存并启用**(saveDesign saveAndStart=true,正式版本生效),正式回读用 `getDesignBySceneId`。仅 `mode:"stash"` 时走暂存(saveStashSnapshot,非正式生效,需设计器手动发布)。
109
-
110
- ## CLI
111
-
112
- ```bash
113
- e10-cli actionflow component-list
114
- e10-cli actionflow component-describe <type>
115
- e10-cli actionflow generate '{"planFile":"@<绝对路径>","appName":"AI-名称"}' --out generate-result.json # 默认保存并启用
116
- e10-cli actionflow generate '{"planFile":"@...","mode":"stash"}' # 显式暂存(不启用)
117
- e10-cli actionflow application-list '{"name":"动作流名称"}' # 先发现动作流应用,再用唯一结果的精确 appId
118
- e10-cli actionflow activate-version '{"appId":"动作流ID","sceneId":"版本场景ID"}' # 只切换默认打开版本,不改变启用状态
119
- e10-cli actionflow enable '{"appId":"动作流ID"}' # 单独启用,不修改设计、不创建版本
120
- e10-cli actionflow disable '{"appId":"动作流ID"}' # 单独禁用,不修改设计、不创建版本
121
- e10-cli actionflow update '@update-plan.json' --out update-result.json # 读取后按原 ID 保留式修改;一次保存,失败停止
122
- ```
123
-
124
- 常用发现命令:`form-search`、`form-applications`、`form-list`、`form-fields`、`workflow-browser-list`、`workflow-search`、`workflow-nodes`、`workflow-context-fields`、`recipient-search`、`document-statuses`、`hrm-onboarding-fields`、`variable-list`、`variable-create`、`constant-list`、`constant-group-list`、`constant-group-create`、`constant-create`、`http-connectors`、`http-resources`、`http-interfaces`、`http-interface-detail`、`application-list`、`design-versions`、`read-stash`。变量/常量计划定义和引用见 `references/dynamic_resources.md`。
125
-
126
- ## 触发器边界
127
-
128
- 当前可生成的事件触发器:`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
-
130
- 动作 `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` 修改后的完整设计。
131
-
132
- 动作 `DMLExecute` 用于执行自定义 SQL 或存储过程,参数要求见 `references/components/database/DMLExecute.md`。只支持新版数仓结构,`operateType` 固定为 `0`;数据源连接 ID 必须通过 `actionflow datasource-list` 从当前环境取得,SQL 占位符与 `fieldSet` 必须严格对应。含 DML 的生成结果还要检查 `sqlAnalysisOk=true`,因为平台 SQL 分析失败可能不会阻断保存。
133
-
134
- 含复杂 JSON 时优先用 `generate` 的 `planFile` 参数,且必须写为 `@plan.json` 或 `@绝对路径`,避免 shell 转义改变内容。只以终端摘要的 `valid/saved/readBackVerified/workflowUrl` 判断成功;完整结果用 `--out` 保存,禁止依据截断输出重试。
135
-
136
- `update` 同样只以终端摘要的 `valid/saved/readBack.ok/workflowUrl` 判断成功;完整设计和回读结果使用 `--out` 保存。修改计划只接受 `@文件名` 形式,不兼容裸文件名。已有动作流更新时 `event` 触发器是不可变边界:更新计划不得替换或修改 `/event`,若需求要改变触发类型、触发表单、触发时机或触发器参数,CLI 必须在 `check/saveDesign` 前拒绝,并提示新建动作流。通过更新校验后,正式保存固定发送 `saveNewVersion:true`,在原动作流下创建平台新版本;保存后按新版场景 ID 回读,不能因平台重分配动作节点 ID 或终止节点 ID 而误报失败;`saveAndStart` 只继承/控制启用状态,不改变这一版本策略。
137
-
138
- 成功生成后,CLI 会在应用描述中写入稳定的 `e10-cli:actionflow:v1:<plan指纹>` 标识,并仅清理**同一标识、`AI-` 前缀且不是当前应用**的旧生成尝试;名称可以不同。每条都执行“禁用 → 回收删除 → getAppById 确认不存在”。没有该标识的历史动作流不自动删除,避免误删人工流;清理结果/失败原因返回在 `duplicateCleanup`,当前失败应用的回收失败返回 `cleanupWarning`,不把接口失败归因于 Skill。
139
-
140
- ## 组件目录
141
-
142
- 选中类型后只读取 `references/components/<分类>/<type>.md` 对应文件;不读取同分类的其他组件文件。
143
-
144
- | 设计器分类 | 组件文件目录 |
145
- |---|---|
146
- | e-builder 数据与表单触发 | `references/components/ebuilder/` |
147
- | 流程 | `references/components/workflow/` |
148
- | 文档 | `references/components/document/` |
149
- | 人员 | `references/components/personnel/` |
150
- | 逻辑 | `references/components/logic/` |
151
- | HTTP/HTTPS 接口 | `references/components/http/` |
152
- | 消息提醒 | `references/components/message/` |
153
- | 内置 MQ / 自定义事件 | `references/components/trigger/`、`references/components/message/` |
154
- | 会议、日程 | `references/components/calendar/` |
155
- | 简单定时器 | `references/components/trigger/` |
156
-
157
- 额外按需规则:
158
-
159
- - 使用流程/表单触发器的系统字段、数据 ID 或动态引用时,读取 `references/trigger_runtime_notes.md`。
160
- - 使用 `Condition` 或 e-builder 筛选条件时,读取 `references/condition_rules.md`。
161
- - 组件需要计算、转换或函数树时,读取 `references/function_rules.md`;仅在该组件的说明允许函数树时使用。
162
-
163
- 筛选条件左值的字段身份必须按实时 `componentKey` 生成,不能只按字段 ID 是否为数字判断。普通 e-builder 业务字段才使用 `field_<id>`;`Workflow` 关联流程字段使用原始数字 `fieldName`、`fieldType:"String"`、空 `module`/`originBrowserType`、`formInfo.formId/layoutId`、顶层 `sformId` 和仅含 `fieldId` 的 `config`。Workflow 的 `sformId` 必须由 `workflowPath.formIds` 反查真实流程表单对象;查不到就停止,不能用目标表单版本 ID兜底。保存后正式回读必须检查左值没有出现“已删除”。
164
-
165
- ## 不变约束
166
-
167
- - 动作流名称默认 `AI-` 前缀。
168
- - 所有流程、表单、字段、人员、目录、规则和身份均取自当前租户。
169
- - 不支持的组件或缺少真实前端对象的属性明确拒绝,不走保底伪造。
170
- - 凭据只复用 e10-cli 登录态,不写入 Skill、计划或输出。
1
+ ---
2
+ name: generating-actionflows
3
+ description: "将业务需求编译为 Weaver ESB 动作流,或读取已有动作流后按原 ID 保留式修改:查询真实对象、正式保存、回读校验并返回设计器链接。运行能力来自 e10-cli 的 actionflow 命令组(复用 e10-cli 登录态)。新建默认保存并启用;仅当用户明确要求暂存时传 mode:stash。已有动作流修改走 update。"
4
+ ---
5
+
6
+ # Weaver 动作流生成
7
+
8
+ 将需求编译为「触发器 → 动作链 → 结束」的 ESB 动作流。先发现真实平台数据,再生成;不根据名称、历史场景或示例猜测任何平台对象。
9
+
10
+ 运行能力来自 `e10-cli actionflow` 命令组(已合并进 e10-cli 本体,复用其登录态,无需单独导出环境变量)。默认**保存并启用**(saveDesign saveAndStart=true);仅当用户明确要求暂存时传 `mode:"stash"` 走暂存(saveStashSnapshot)。
11
+
12
+ ## 运行与维护边界
13
+
14
+ - **运行模式(默认)**:只运行 `e10-cli actionflow <命令>`、读取本 Skill 的当前阶段/当前组件说明;不得读取或修改 e10-cli 源码(`packages/cli/src/services/actionflow/`)。
15
+ - **维护模式**:仅在用户明确要求修复、审计或新增组件时编辑实现;修改后必须跑类型检查、测试、构建和本 Skill 校验。校验目标固定为 `skill/actionflows`:不要把上层 `skill` 或发布目录 `skill-docs` 当作这个动作流 Skill 的标准目录校验。上层入口包含 E10 包的自定义元数据(如 `author`、`category`、`version`、`display_name`),不因通用校验器不认识这些扩展字段而改写、删除或迁移它们。
16
+ - 参数、默认值、动态必填、真实对象结构的唯一权威是 `e10-cli actionflow component-describe <type>`,参考文件不重复属性表。
17
+ - 动态赋值必须按“组件 × 属性”判断,不能因为属性类型写着 `Browser` 或 `platform_reference` 就一律当成固定值。先读取 [`references/dynamic_capability_matrix.md`](references/dynamic_capability_matrix.md),再以当前租户 `component-describe`、上下文元数据和组件编译器实际契约为准;矩阵没有明确标记为已支持的属性不得臆造动态 DTO。
18
+
19
+ ## 生成 SOP
20
+
21
+ 按顺序推进;只读取当前步骤需要的信息。每个场景是独立事务。
22
+
23
+ ### 1. 识别与选择
24
+
25
+ 1. 拆出触发器、动作顺序、条件/循环、固定资源与动态来源。
26
+ 2. 运行 `e10-cli actionflow component-list`,选择已登记组件。
27
+ 3. 对每一个选中的组件运行 `e10-cli actionflow component-describe <type>`,再只读取下方目录中该组件的 Markdown。
28
+ 4. 若存在多个业务选择会改变结果,或用户明确指定的资源找不到,暂停说明差异并询问;其余可查询的信息直接查询。
29
+
30
+ ### 2. 发现真实数据
31
+
32
+ 按 `component-describe` 的 `propertySources` 查询本次租户数据:
33
+
34
+ - 流程:`e10-cli actionflow workflow-browser-list` / `workflow-search` / `workflow-nodes`。
35
+ - 流程动态字段:`e10-cli actionflow workflow-context-fields`。默认每页 20 条;按需求字段名先传 `query`(例如 `{"workflowId":"<id>","query":"数据ID"}`),只使用本次返回的 `fields[].paramKey`。完整响应过大时用 `--out context.json` 落盘,禁止依赖终端截断后的片段。
36
+ - e-builder(**已知表名时首选**):`e10-cli actionflow form-search '{"keyword":"<表名>"}'` 一次拿到表单 `objId` 与它所属的业务应用 `appId`。服务端是**子串模糊匹配**,同名表跨多个应用很常见(返回体里的 `完全同名` 即同名条数)—— **多于一条时必须按 `appName` 收窄再取**,不得自行挑一个:`'{"keyword":"<表名>","appName":"<应用名>"}'`。`keyword` 传 `objId` 则是精确命中,可用来由 id 反查所属应用。
37
+ - **`appName` 走服务端过滤**(不是本地二次筛):应用名精确唯一才用;**同名多命中或查无此名会直接报错并列出候选**,此时改用 `appId` 指定,不要换个近似名重试。
38
+ - **返回体 `total` 是服务端在该筛选下的命中总数,`hits` 可能只是其中一部分。** 默认最多返回 100 条,超出时 `truncated: true` 并给出 `omitted`(未返回条数)。**`truncated` 为真时绝不能判定「表单不存在」** —— 先按 `appName` 收窄,确需全部再传 `{"max":0}`(条数大时用 `--out <file>` 落盘)。判断是否唯一命中以 `唯一命中` 字段为准,不要自己数 `hits` 长度。
39
+ - e-builder(**只知道应用、要浏览全表**):`e10-cli actionflow form-applications` → `form-list` → `form-fields`。`form-applications` 返回的业务应用 `id` 用于下一步:`e10-cli actionflow form-list '{"groupId":"<业务应用ID>"}'`;这里必须是 `groupId`,不能传 `appId`。表单字段查询才使用 `{"tableId":"<表单ID>","appId":"<业务应用ID>"}`。
40
+ - 人员:`e10-cli actionflow recipient-search`。
41
+ - 人员入职/更新字段:`e10-cli actionflow hrm-onboarding-fields`。
42
+ - 文档状态:`e10-cli actionflow document-statuses`。
43
+
44
+ 查不到真实对象、字段或前端 DTO 时,不猜测 ID 或对象结构,说明未支持字段并停止该字段的生成。
45
+
46
+ ### 3. 组装语义计划
47
+
48
+ 1. 写入 `event`、`actions`,条件和循环作为动作拓扑的一部分。
49
+ 2. 只传 `component-describe` 声明的参数;固定值与动态值根据业务需求选择,不能为了动态而动态。
50
+ 3. 语义 plan 的节点配置统一放在 `params`:`event.params`、`actions[*].params` 以及条件/循环内部节点的 `params`。`data` 仅属于平台回读/更新 DTO,不能出现在 `generate` 语义计划中;CLI 会在调用任何平台接口前拒绝该结构,并提示具体路径。
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。
53
+ 5.1. 所有 CLI 生成或继续编译的 FormulaBean,只要包含 `frontId`,允许使用空串;非空时必须使用平台真实字段 ID 的纯数字字符串。`field_<数字>` 仅可在生成时规范化为 `<数字>`。禁止把字段名、paramKey 尾段、临时公式 ID 或其他包含字母/符号的值写入 `frontId`;非空值无法解析为纯数字时必须直接报错。
54
+ 6. 定时组件优先使用平台原生频率:`rate=1` 一次、`2` 按小时、`3` 按日、`4` 按周、`5` 按月,并按需提供 `cycle`、`hour`、`day`、`week`、`atWeek`、`atWeekDetail` 或 `lastWeek`;只有明确选择 `rate=6` 时才传 `cornString`。图形化频率必须提供 `startTime`。
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
+ 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` 动态片段。
58
+ 9.1. 每个参数先分为“动态公式属性”“动态人员属性”“固定平台资源属性”三类:上下文、系统变量、变量、常量、函数/公式必须保留为 FormulaBean;动态人员必须使用真实人员字段上下文或系统变量,不得把引用里的 `id` 当人员 Browser ID 查询;工作流、文档目录、按钮、规则等平台资源只有在其组件契约明确提供动态引用时才允许动态化。生成前必须记录本次组件/属性的判定,生成后按属性检查回读结果;具体映射和验证状态见 `references/dynamic_capability_matrix.md`。
59
+ 10. 自定义事件和内置 MQ 的参数必须按对应平台组件说明提供原生参数对象;`CustomTrigger.customData`、`InnerMQListener.receiveParams`、`InnerMQSend.sendParams` 不能用猜测的字段替代。若验证要求“输入参数里有字段”,必须在生成前提供至少一行真实原生参数;`tables:[]`、`tableList:[]` 或省略 `receiveParams` 只能表示无输入参数,不能作为有参数的占位。`InnerMQListener` 与 `InnerMQSend` 是动作流级互斥组件,同一计划(包括条件/循环嵌套)同时出现时,CLI 在任何平台写接口前直接报错。
60
+ 11. 根触发节点的 `event.attr.icon` 必须使用平台真实图标:`CustomTrigger` 为 `Icon-N-Triggerrul`,`InnerMQListener` 为 `Icon-built-in-mq-listening-mcolor`;组件目录里的动作图标不能覆盖根触发器图标。保存后回读必须同时检查触发器图标、已声明输入参数的数量和查询字段,不能仅凭 `valid=true` / `saved=true` 判定配置正确。
61
+ 12. `InnerMQSend.sendParams.tableData` 必须遵循“参数类型决定数据类型候选”的平台规则:普通非数组标量通常只有“属性”一个选项,不应伪造可下拉状态;数组或 `json/xml/xml_string` 结构化参数才按真实候选设置 `dataType`,结构化参数的下级用 `parentId` 表达,并保留父子约束。具体规则见 `references/components/message/InnerMQSend.md`。
62
+
63
+ ### 4. 生成与逐场景反馈
64
+
65
+ 1. 一次只运行一个 `generate`。
66
+ 2. 成功保存并启用后立即返回名称、状态与 `workflowUrl`,再处理下一个场景。
67
+ 3. 批量任务完成后再给汇总表;一个场景失败不阻断其他场景。
68
+
69
+ ### 4.1 修改已有动作流
70
+
71
+ 已有动作流必须走独立的 `update` 命令,不得把已有 `appId` 塞进 `generate`,也不得按名称猜测目标。只有在没有精确 ID 时,先用 `application-list` 查询动作流应用(不是 `form-applications` 的业务应用列表),按名称和所属业务应用核对;结果必须唯一,查不到或有歧义就请求精确 `appId`,不能自行挑一个:
72
+
73
+ ```bash
74
+ e10-cli actionflow update '@update-plan.json' --out update-result.json
75
+ ```
76
+
77
+ 修改计划必须使用以下结构:
78
+
79
+ ```json
80
+ {
81
+ "appId": "已有动作流的精确 ID",
82
+ "operations": [
83
+ {"op":"edit-node", "nodeId":"原节点 ID", "patch":{"data":{"...":"..."}}},
84
+ {"op":"delete-node", "nodeId":"要删除的原节点 ID"},
85
+ {"op":"add-node", "parentPath":"/actions", "index":1, "node":{"type":"平台节点类型","data":{}}},
86
+ {"op":"add-condition-branch", "conditionNodeId":"已有分支节点 ID", "branchName":"新增分支", "conditionDetail":{"conditionDataJson":"平台条件树 JSON"}, "branchActions":[]},
87
+ {"op":"replace", "path":"/actions/0/data/...", "value":"新值"},
88
+ {"op":"remove", "path":"/actions/0/data/..."}
89
+ ]
90
+ }
91
+ ```
92
+
93
+ 操作必须显式声明;`edit-node` 深合并 `patch`,原节点 `id/wId` 不允许修改;`delete-node` 会从设计树移除节点并填充 `deleteActions`;`add-node` 使用 `read-design --out` 得到的平台原生节点结构,可用 `index` 插入指定位置,自动补雪花 ID 并填充 `addIds`。`add-condition-branch` 专门新增 `otherConditionBranch`,必须提供已有 Condition 节点 ID 和包含 `conditionDataJson` 的完整条件详情;CLI 会先调用条件服务保存规则,使用返回的真实 `conditionId/mapId/conditionKey`,再保存动作流,不能手工伪造条件 ID。分支内动作可通过 `branchActions` 提供,缺少节点 ID 时 CLI 自动补 ID 并从当前租户组件目录补齐节点壳。新增执行节点必须插在终止节点之前,且同步修改终止节点的 `sources`。回读对象中的平台展示字段会先转换为 `saveDesign` 接受的写入 DTO(例如 EventButton 的 `eventButtonId` 和按钮对象),不能把回读 JSON 原样作为接口体。更新计划中的节点 ID 必须来自本次正式 `read-design`,不能复用更早版本的 ID。保存新版时平台可能为动作/出口重新分配内部 ID;回读校验优先按 ID,ID 变化时按动作树路径和类型匹配,不能因版本复制产生新 ID 就误判失败。`sources[].id` 由平台保存时动态分配/回读时可能省略,必须通过稳定的 `sources[].wId` 校验。未操作的节点和属性从正式回读原样作为保存基线,不会被新建编译器重建;新建动作流的 `assistLayer` 只写平台空骨架 `{"nodes":[],"layout":{}}`,更新已有动作流保留原生 X6 画布节点,不得伪造扁平 `{id,type,layout}` 节点,也不能把旧版本悬空节点带入新版。更新前自动备份完整正式设计到 `.actionflow-plans/backups/`;也可以传 `backupFile` 指定路径。
94
+
95
+ 更新默认根据目标动作流当前状态决定 `saveAndStart`,保持启用/未启用状态;只有计划显式传 `saveAndStart` 才改变它。触发器 `event` 必须原样保留,禁止通过 `replace/remove` 修改 `/event` 或其子路径;如果要改变触发类型、触发表单、触发时机或触发器参数,必须新建动作流。正式更新固定带 `saveNewVersion:true`,保存为原动作流的新版本。保存后无论目标原本启用还是禁用,CLI 都必须调用设计器真实的 `setActiveVersion/{appId}/{newSceneId}`,再读版本列表确认 `activeVersion` 是新版本;`saveAndStart` 只控制动作流启用状态,不控制活动版本。保存响应未返回新版 ID 时,CLI 必须重新查询版本列表定位版本号更大的新场景,再对新版正式回读;定位不到新版时不能拿旧版冒充校验通过。一次 update 最多执行一次正式保存:如果已保存但激活失败、活动版本回读不一致或正式回读失败,结果必须保留 `saved/sceneId/backupFile` 证据并停止,不能自动重跑、再次新建版本、回滚或删除;需要重试时由用户确认并基于新结果重新规划。保存后必须正式回读并检查编辑、新增、删除及未修改节点是否仍在。
96
+
97
+ ### 5. 回读与异常分流
98
+
99
+ - 预检/编译失败:修正计划或报告缺失真实对象;不会创建动作流。
100
+ - 保存并启用成功但正式回读不一致:不得宣称验证通过;根据回读定位计划或组件问题,修复后重试,旧测试流由 CLI 回收。
101
+ - 保存并启用成功且正式回读通过:返回链接。
102
+ - 保存失败:返回平台错误原因;不自动退回暂存。
103
+ - 平台接口或前端编辑器不可用:明确区分「JSON/readBack 已验证」和「UI 待确认」。
104
+
105
+ ## 流程节点触发绑定
106
+
107
+ `generate` 的 event 节点(`ApproveTrigger`)自带流程节点触发绑定:单条规则用 `workflowPath`(流程 id)+ `triggerTiming`;同一流程有多个触发时机时用 `triggerRules` 数组,编译为一个 `singleApproveConfigs[workflowId]` 规则数组。节点型时机使用 `approveNode`,出口型 `link` 必须使用真实 `approveLink`;编译器逐条校验可选节点类型与执行时间,不走 pathdef/addaction。多规则需要不同后续动作时,先按触发器上下文 `triggerType` / `executeTime` / `triggerNodeOrLinkId` 放 `Condition` 分支。完整联动表见 `references/components/workflow/ApproveTrigger.md`。
108
+
109
+ `generate` 默认**保存并启用**(saveDesign saveAndStart=true,正式版本生效),正式回读用 `getDesignBySceneId`。仅 `mode:"stash"` 时走暂存(saveStashSnapshot,非正式生效,需设计器手动发布)。
110
+
111
+ ## CLI
112
+
113
+ ```bash
114
+ e10-cli actionflow component-list
115
+ e10-cli actionflow component-describe <type>
116
+ e10-cli actionflow generate '{"planFile":"@<绝对路径>","appName":"AI-名称"}' --out generate-result.json # 默认保存并启用
117
+ e10-cli actionflow generate '{"planFile":"@...","mode":"stash"}' # 显式暂存(不启用)
118
+ e10-cli actionflow application-list '{"name":"动作流名称"}' # 先发现动作流应用,再用唯一结果的精确 appId
119
+ e10-cli actionflow activate-version '{"appId":"动作流ID","sceneId":"版本场景ID"}' # 只切换默认打开版本,不改变启用状态
120
+ e10-cli actionflow enable '{"appId":"动作流ID"}' # 单独启用,不修改设计、不创建版本
121
+ e10-cli actionflow disable '{"appId":"动作流ID"}' # 单独禁用,不修改设计、不创建版本
122
+ e10-cli actionflow update '@update-plan.json' --out update-result.json # 读取后按原 ID 保留式修改;一次保存,失败停止
123
+ ```
124
+
125
+ 常用发现命令:`form-search`、`form-applications`、`form-list`、`form-fields`、`workflow-browser-list`、`workflow-search`、`workflow-nodes`、`workflow-context-fields`、`recipient-search`、`document-statuses`、`hrm-onboarding-fields`、`variable-list`、`variable-create`、`constant-list`、`constant-group-list`、`constant-group-create`、`constant-create`、`http-connectors`、`http-resources`、`http-interfaces`、`http-interface-detail`、`application-list`、`design-versions`、`read-stash`。变量/常量计划定义和引用见 `references/dynamic_resources.md`。
126
+
127
+ ## 触发器边界
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`。
130
+
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
+
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` 修改后的完整设计。
134
+
135
+ 动作 `DMLExecute` 用于执行自定义 SQL 或存储过程,参数要求见 `references/components/database/DMLExecute.md`。只支持新版数仓结构,`operateType` 固定为 `0`;数据源连接 ID 必须通过 `actionflow datasource-list` 从当前环境取得,SQL 占位符与 `fieldSet` 必须严格对应。含 DML 的生成结果还要检查 `sqlAnalysisOk=true`,因为平台 SQL 分析失败可能不会阻断保存。
136
+
137
+ 含复杂 JSON 时优先用 `generate` 的 `planFile` 参数,且必须写为 `@plan.json` 或 `@绝对路径`,避免 shell 转义改变内容。只以终端摘要的 `valid/saved/readBackVerified/workflowUrl` 判断成功;完整结果用 `--out` 保存,禁止依据截断输出重试。
138
+
139
+ `update` 同样只以终端摘要的 `valid/saved/readBack.ok/workflowUrl` 判断成功;完整设计和回读结果使用 `--out` 保存。修改计划只接受 `@文件名` 形式,不兼容裸文件名。已有动作流更新时 `event` 触发器是不可变边界:更新计划不得替换或修改 `/event`,若需求要改变触发类型、触发表单、触发时机或触发器参数,CLI 必须在 `check/saveDesign` 前拒绝,并提示新建动作流。通过更新校验后,正式保存固定发送 `saveNewVersion:true`,在原动作流下创建平台新版本;保存后按新版场景 ID 回读,不能因平台重分配动作节点 ID 或终止节点 ID 而误报失败;`saveAndStart` 只继承/控制启用状态,不改变这一版本策略。
140
+
141
+ 成功生成后,CLI 会在应用描述中写入稳定的 `e10-cli:actionflow:v1:<plan指纹>` 标识,并仅清理**同一标识、`AI-` 前缀且不是当前应用**的旧生成尝试;名称可以不同。每条都执行“禁用 → 回收删除 → getAppById 确认不存在”。没有该标识的历史动作流不自动删除,避免误删人工流;清理结果/失败原因返回在 `duplicateCleanup`,当前失败应用的回收失败返回 `cleanupWarning`,不把接口失败归因于 Skill。
142
+
143
+ ## 组件目录
144
+
145
+ 选中类型后只读取 `references/components/<分类>/<type>.md` 对应文件;不读取同分类的其他组件文件。
146
+
147
+ | 设计器分类 | 组件文件目录 |
148
+ |---|---|
149
+ | e-builder 数据与表单触发 | `references/components/ebuilder/` |
150
+ | 流程 | `references/components/workflow/` |
151
+ | 文档 | `references/components/document/` |
152
+ | 人员 | `references/components/personnel/` |
153
+ | 逻辑 | `references/components/logic/` |
154
+ | HTTP/HTTPS 接口 | `references/components/http/` |
155
+ | 消息提醒 | `references/components/message/` |
156
+ | 内置 MQ / 自定义事件 | `references/components/trigger/`、`references/components/message/` |
157
+ | 会议、日程 | `references/components/calendar/` |
158
+ | 简单定时器 | `references/components/trigger/` |
159
+
160
+ 额外按需规则:
161
+
162
+ - 使用流程/表单触发器的系统字段、数据 ID 或动态引用时,读取 `references/trigger_runtime_notes.md`。
163
+ - 使用 `Condition` 或 e-builder 筛选条件时,读取 `references/condition_rules.md`。
164
+ - 组件需要计算、转换或函数树时,读取 `references/function_rules.md`;仅在该组件的说明允许函数树时使用。
165
+
166
+ 筛选条件左值的字段身份必须按实时 `componentKey` 生成,不能只按字段 ID 是否为数字判断。普通 e-builder 业务字段才使用 `field_<id>`;`Workflow` 关联流程字段使用原始数字 `fieldName`、`fieldType:"String"`、空 `module`/`originBrowserType`、`formInfo.formId/layoutId`、顶层 `sformId` 和仅含 `fieldId` 的 `config`。Workflow 的 `sformId` 必须由 `workflowPath.formIds` 反查真实流程表单对象;查不到就停止,不能用目标表单版本 ID兜底。保存后正式回读必须检查左值没有出现“已删除”。
167
+
168
+ ## 不变约束
169
+
170
+ - 动作流名称默认 `AI-` 前缀。
171
+ - 所有流程、表单、字段、人员、目录、规则和身份均取自当前租户。
172
+ - 不支持的组件或缺少真实前端对象的属性明确拒绝,不走保底伪造。
173
+ - 凭据只复用 e10-cli 登录态,不写入 Skill、计划或输出。
@@ -12,7 +12,7 @@
12
12
 
13
13
  不要把 `Output` 写入 `actions`。`reminderMsgFormula` 与 `basisValue` 支持固定值、上下文、系统变量、变量、常量、查询结果和函数/公式;`jumpUrl` 在前端只允许固定文本。`fixedData`、`customOutputData` 属于平台原生高级输出结构,必须使用真实回读结构,不能猜测。
14
14
 
15
- 如果自定义触发动作流需要配置终止参数,在 `finalOutput.params.customParamSetting` 中使用同一套 `CustSetFormDto` 结构,`formType` 改为 `output`,新建时 `customId` 传空字符串,`deleteTableIds` 传空数组,`appId` 由编译器注入当前动作流应用 ID,关联 ID 由后端保存方法生成。
15
+ 如果自定义触发动作流需要配置终止参数,在 `finalOutput.params.customParamSetting` 中使用同一套 `CustSetFormDto` 结构,`formType` 改为 `output`,新建时 `customId` 传空字符串,`deleteTableIds` 传空数组,`appId` 由编译器注入当前动作流应用 ID,关联 ID 由后端保存方法生成。终止参数字段的映射关系必须写在 `tableList[].fields[].formulaValue`,对应后端 `CustFormDetailDto.formulaValue`;不能放在字段的 `value`、`mapping` 或其他自定义属性中。
16
16
 
17
17
  ## 最小计划
18
18
 
@@ -48,3 +48,35 @@
48
48
  ## 上下文
49
49
 
50
50
  触发后业务字段上下文根为 `SelectParams`,可引用 `SelectParams.<主表/明细表路径>`;同时可使用平台提供的 `FormField`、`SettingInfo`、`accessId` 和 `monitorId`。不要将自定义触发字段编译为 `FormData`。
51
+
52
+ 动态赋值的 `paramKey` 只写业务路径,不写 `FormData.`、`ApprovalData.` 或 `SelectParams.` 前缀。主表和明细表必须沿用同一个主表 key:主表字段写成 `主表key.字段key`,明细字段写成 `主表key.明细表key[].字段key`;只有最终公式的 `value`、`currentParamKey` 和 `allParamKey` 使用 `SelectParams.` 前缀。不能把明细字段写成 `FormData.明细表key[].字段key`,也不能省略前面的主表 key。
53
+
54
+ ## 自定义参数来源的 `frontId` 规则
55
+
56
+ 动态赋值来源于当前触发组件的 `customData` 时,必须把 `event.params.customData`(后端类型 `CustSetFormDto`)作为唯一 ID 来源。不要从目标字段、FormulaBean 自身的 `id` 或 `paramKey` 尾段推导 `frontId`。
57
+
58
+ 按以下顺序生成:
59
+
60
+ 1. 先按动态引用的表路径,在 `customData.tableList[]` 中找到对应的表对象(后端类型 `CustFormTableDto`)。
61
+ 2. 如果引用选择的是表维度(例如 `主表key.明细表key[]`),生成的 FormulaBean 写 `frontId = tableList[].id`。
62
+ 3. 如果引用选择的是字段维度(例如 `主表key.字段key` 或 `主表key.明细表key[].字段key`),先在匹配表的 `fields[]` 中找到对应字段对象(后端类型 `CustFormDetailDto`),再写 `frontId = fields[].id`。
63
+ 4. 这个 `frontId` 要写到关联映射生成的 FormulaBean 上,包括普通动作映射和终止组件 `customParamSetting.tableList[].fields[].formulaValue`;不能写目标字段 ID、表名、字段名、临时公式 ID 或 `paramKey` 尾段。
64
+ 5. 对应表/字段没有真实 ID 时,`frontId` 写空串 `""`;有值时必须是纯数字字符串。`field_<数字>` 只能在生成时转成 `<数字>`。
65
+
66
+ 例如:
67
+
68
+ ```json
69
+ {
70
+ "customData": {
71
+ "tableList": [{
72
+ "id": "1001",
73
+ "fields": [{"id": "2001", "paramName": "name"}]
74
+ }]
75
+ },
76
+ "mapping": {
77
+ "targetFieldId": {"kind": "context", "paramKey": "main.name"}
78
+ }
79
+ }
80
+ ```
81
+
82
+ 上例生成的关联 FormulaBean 必须是 `frontId: "2001"`;如果引用的是 `main[]` 表节点,则必须是 `frontId: "1001"`。
@@ -10,7 +10,7 @@
10
10
 
11
11
  ## 不可猜测
12
12
 
13
- 目标流程必须带真实表单字段;标题可固定、上下文或系统变量,映射目标字段不能猜。
13
+ 目标流程必须带真实表单字段;标题可固定、上下文或系统变量,映射目标字段不能猜。保存时按后端 `ApproveCreateDTO` 组织 `workflowPath`、`formData`、`operator`、`applicationId` 等字段;DTO 中的 `fields` 不参与新建流程保存,不能把它当成必填配置。
14
14
 
15
15
  ## 最小计划
16
16
 
@@ -59,7 +59,10 @@
59
59
  - 公式/值带出可 inline:`formula` / `relateFrom`
60
60
  - **Flow 字段**:`sformId` 是流程表单 objId(不是 workflowId),建表时写进 fields.json 即自动绑定——关联到哪个流程表单就只能选该范围的流程数据,无需单独配数据范围
61
61
  - **二级明细**:逐条列出“父明细 → 子明细”、父级行标识、子级文本行标识和是否默认展开;执行时先读取父明细的可选子明细,再按[二级明细表配置](../form/guide-form-sub-detail.md)创建并回读。
62
- > 不要先建空表再 add-field——add-field/edit-field 只是**罕见补救手段**
62
+ > **新建表单**时把字段一次规划全、随建表写进 `fields.json`,别先建空表再一个个补——补字段要重排布局,容易漏掉布局属性。
63
+ > 这句只针对「新建」。`add-field` / `edit-field` **是维护已有表的正常命令**,不是补救手段:
64
+ > - 给**已经存在**的表加字段 → `form add-field`
65
+ > - 改已有字段的类型 / 标题 / 必填 / 长度 / 描述 → `form edit-field`(**支持改类型**,走读-改-写,不用删字段重建,显示名 / 列名 / 位置都保留)
63
66
 
64
67
  虚拟表补充清单(普通 EB 表单删除本段):
65
68
  - [ ] 数据源定位 | 来源类别: EB 表单 / 系统业务表 / 数据加工 | 名称/ID: <来源>
@@ -88,6 +91,7 @@
88
91
  - [ ] 复杂编号 | `form serial-mark set <objId> <appId> <fieldId> --segments @json`(纯建模表:fixed/year/serial/field/system/date+代字;⚠ 绑流程表无效→走 `workflow numbering`)
89
92
  - [ ] 值带出(关联表) | `form relate <appId> <objId> <目标字段> --from <Employee/Department源字段>`(换申请人→填邮箱/工号/部门;HRM属性带出,简单单源)
90
93
  - [ ] 值带出(跨表/多跳) | `form field-linkage add <appId> <objId> --trigger <触发字段> --target <目标字段> --hops "<源表objId:带出字段,源表objId:带出字段,...>"`(跨表查询带出,支持多跳链式中转;Text 字段必须多跳到名称表取名称不能直接赋 ID)
94
+ - [ ] 本表字段自动计算(函数联动) | `form formula-linkage add <appId> <objId> --event changeField --trigger <触发字段> --target <目标字段> --expression "VALUE({主表.数量})*VALUE({主表.单价})"`(本表字段间的公式赋值;表达式只给右侧。系统模块字段如 `{主表.当前日期}` 可作来源/触发,但不可作目标)
91
95
  - [ ] 关联显示列 | `form ebuilder-columns <objId> <appId> <fieldId> [字段名...]`(先不带参数看业务字段候选清单,去系统字段)
92
96
  - [ ] 关联数据范围 | `form ebuilder-scope set <objId> <appId> <fieldId> --rules '[...]'`(如客户状态=启用才可选)
93
97
  - [ ] 字段公式 | `form formula set --expression "DAYS({主表.开始},{主表.结束})" --target <fieldId>`(或 fields.json inline)
@@ -149,13 +153,15 @@
149
153
  - [ ] 结构改完补排版 | `workflow auto-layout <wf>`(**加/删节点、加/删连线之后必跑**;建流程时自动跑过的那一次不算)
150
154
 
151
155
  ###### 权责表设计(搭建方式为权责表时填写,替代普通节点与连线清单)
152
- - [ ] 权责表来源 | 流程内新建 / 复用已有 | 权责表:<名称> | authRespId:待回填
156
+ - [ ] 权责表来源 | 默认流程内新建;仅多重嵌套或明确复用时选择复用已有 | 权责表:<名称> | authRespId:待回填
153
157
  - [ ] 首尾设置 | 发起:<类型及操作者> | 结束:<类型及操作者>
154
158
  - [ ] 中间节点 | <节点名称、类型、操作者>
155
159
  - [ ] 分支路径 | <场景说明> | 条件:<条件> | 路径:<节点及顺序>
156
160
  - [ ] 嵌套权责表 | <适用分支> | 引用:<权责表及版本> | 顺序:<序号>
157
- - [ ] 变量映射 | <权责表变量> → <当前流程表单字段> / 无需映射
161
+ - [ ] 条件字段来源 | 系统字段 / 当前流程表单字段 / 独立权责表变量
162
+ - [ ] 变量映射 | <独立权责表变量(主表/明细)> → <当前流程实际表单字段(主表/明细)> / 随流程新建无需映射
158
163
  > 权责表方式流程的节点、分支条件和流转路径统一在权责表设计中维护;复用独立权责表时逐项列出变量映射。
164
+ > 一般权责表流程使用 `auth-resp-flow create --new-table`,条件直接引用流程表单字段;多重嵌套或跨流程共享同一权责规则时,才规划独立权责表、嵌套引用及 `--reuse-table` 变量映射。
159
165
 
160
166
  ##### 4.3 出口条件清单(来源: 本流程 <流程名A>;必填,动手前逐条列出,防遗漏)
161
167
  段② 执行到条件时,先按此表列出所有连线的完整条件,逐条确认后再 `workflow condition add`: