weaver-e10-builder 1.0.10-beta → 1.0.12-beta

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 (254) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +10 -6
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/auth.d.ts.map +1 -1
  5. package/dist/commands/auth.js +13 -0
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/form-layout-init.d.ts.map +1 -1
  8. package/dist/commands/form-layout-init.js +7 -1
  9. package/dist/commands/form-layout-init.js.map +1 -1
  10. package/dist/commands/form-list-permission.d.ts.map +1 -1
  11. package/dist/commands/form-list-permission.js +130 -15
  12. package/dist/commands/form-list-permission.js.map +1 -1
  13. package/dist/commands/form-nlist.d.ts +22 -0
  14. package/dist/commands/form-nlist.d.ts.map +1 -0
  15. package/dist/commands/form-nlist.js +179 -0
  16. package/dist/commands/form-nlist.js.map +1 -0
  17. package/dist/commands/form-serial-mark.d.ts +0 -15
  18. package/dist/commands/form-serial-mark.d.ts.map +1 -1
  19. package/dist/commands/form-serial-mark.js +604 -137
  20. package/dist/commands/form-serial-mark.js.map +1 -1
  21. package/dist/commands/form.d.ts.map +1 -1
  22. package/dist/commands/form.js +145 -16
  23. package/dist/commands/form.js.map +1 -1
  24. package/dist/commands/skill.d.ts +3 -0
  25. package/dist/commands/skill.d.ts.map +1 -0
  26. package/dist/commands/skill.js +112 -0
  27. package/dist/commands/skill.js.map +1 -0
  28. package/dist/commands/wf-form.d.ts +18 -0
  29. package/dist/commands/wf-form.d.ts.map +1 -1
  30. package/dist/commands/wf-form.js +156 -181
  31. package/dist/commands/wf-form.js.map +1 -1
  32. package/dist/commands/workflow-condition.d.ts.map +1 -1
  33. package/dist/commands/workflow-condition.js +3 -1
  34. package/dist/commands/workflow-condition.js.map +1 -1
  35. package/dist/commands/workflow-create-workflow.d.ts.map +1 -1
  36. package/dist/commands/workflow-create-workflow.js +14 -0
  37. package/dist/commands/workflow-create-workflow.js.map +1 -1
  38. package/dist/commands/workflow-node-validate.d.ts.map +1 -1
  39. package/dist/commands/workflow-node-validate.js +16 -2
  40. package/dist/commands/workflow-node-validate.js.map +1 -1
  41. package/dist/commands/workflow-numbering.d.ts.map +1 -1
  42. package/dist/commands/workflow-numbering.js +18 -2
  43. package/dist/commands/workflow-numbering.js.map +1 -1
  44. package/dist/commands/workflow.d.ts.map +1 -1
  45. package/dist/commands/workflow.js +58 -42
  46. package/dist/commands/workflow.js.map +1 -1
  47. package/dist/index.js +4 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/services/actionflow/build_workflow_draft.d.ts.map +1 -1
  50. package/dist/services/actionflow/build_workflow_draft.js +23 -2
  51. package/dist/services/actionflow/build_workflow_draft.js.map +1 -1
  52. package/dist/services/actionflow/command_output.d.ts +6 -0
  53. package/dist/services/actionflow/command_output.d.ts.map +1 -0
  54. package/dist/services/actionflow/command_output.js +91 -0
  55. package/dist/services/actionflow/command_output.js.map +1 -0
  56. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  57. package/dist/services/actionflow/components/action_eb_add.js +5 -4
  58. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  59. package/dist/services/actionflow/components/action_eb_delete.js +1 -1
  60. package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
  61. package/dist/services/actionflow/components/action_eb_update.js +4 -4
  62. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  63. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_update_compiler.js +4 -1
  65. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  66. package/dist/services/actionflow/components/approve_create.js +1 -1
  67. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  68. package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
  69. package/dist/services/actionflow/components/approve_trigger.js +48 -16
  70. package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
  71. package/dist/services/actionflow/components/date_trigger.js +3 -3
  72. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  73. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  74. package/dist/services/actionflow/components/enquiry_form.js +15 -8
  75. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  76. package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
  77. package/dist/services/actionflow/enrich_approve_trigger.js +47 -17
  78. package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
  79. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  80. package/dist/services/actionflow/formula_service.js +71 -3
  81. package/dist/services/actionflow/formula_service.js.map +1 -1
  82. package/dist/services/actionflow/functions_catalog.d.ts +26 -0
  83. package/dist/services/actionflow/functions_catalog.d.ts.map +1 -0
  84. package/dist/services/actionflow/functions_catalog.js +8986 -0
  85. package/dist/services/actionflow/functions_catalog.js.map +1 -0
  86. package/dist/services/actionflow/functions_source.d.ts +7 -0
  87. package/dist/services/actionflow/functions_source.d.ts.map +1 -0
  88. package/dist/services/actionflow/functions_source.js +50 -0
  89. package/dist/services/actionflow/functions_source.js.map +1 -0
  90. package/dist/services/actionflow/generation_service.d.ts +8 -0
  91. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  92. package/dist/services/actionflow/generation_service.js +60 -2
  93. package/dist/services/actionflow/generation_service.js.map +1 -1
  94. package/dist/services/actionflow/preflight_service.d.ts +6 -0
  95. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  96. package/dist/services/actionflow/preflight_service.js +69 -0
  97. package/dist/services/actionflow/preflight_service.js.map +1 -1
  98. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  99. package/dist/services/actionflow/workflow_compiler.js +102 -85
  100. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  101. package/dist/services/actionflow/workflow_source.d.ts +2 -0
  102. package/dist/services/actionflow/workflow_source.d.ts.map +1 -1
  103. package/dist/services/actionflow/workflow_source.js +8 -0
  104. package/dist/services/actionflow/workflow_source.js.map +1 -1
  105. package/dist/services/condition-rules.d.ts.map +1 -1
  106. package/dist/services/condition-rules.js +3 -1
  107. package/dist/services/condition-rules.js.map +1 -1
  108. package/dist/services/form-create.d.ts.map +1 -1
  109. package/dist/services/form-create.js +4 -1
  110. package/dist/services/form-create.js.map +1 -1
  111. package/dist/services/form-nlist.d.ts +42 -0
  112. package/dist/services/form-nlist.d.ts.map +1 -0
  113. package/dist/services/form-nlist.js +332 -0
  114. package/dist/services/form-nlist.js.map +1 -0
  115. package/dist/services/skill-provision.d.ts +18 -0
  116. package/dist/services/skill-provision.d.ts.map +1 -0
  117. package/dist/services/skill-provision.js +86 -0
  118. package/dist/services/skill-provision.js.map +1 -0
  119. package/dist/services/workflow-initiator.js +3 -3
  120. package/dist/services/workflow-initiator.js.map +1 -1
  121. package/dist/services/workflow-operator.d.ts +3 -1
  122. package/dist/services/workflow-operator.d.ts.map +1 -1
  123. package/dist/services/workflow-operator.js +5 -4
  124. package/dist/services/workflow-operator.js.map +1 -1
  125. package/package.json +4 -2
  126. package/skill-docs/SKILL.md +348 -0
  127. package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +17 -0
  128. package/skill-docs/actionflows/references/components/calendar/ScheduleCreate.md +17 -0
  129. package/skill-docs/actionflows/references/components/document/AttachmentCopy.md +17 -0
  130. package/skill-docs/actionflows/references/components/document/AttachmentMove.md +17 -0
  131. package/skill-docs/actionflows/references/components/document/DocumentCopy.md +17 -0
  132. package/skill-docs/actionflows/references/components/document/DocumentDelete.md +17 -0
  133. package/skill-docs/actionflows/references/components/document/DocumentEdit.md +17 -0
  134. package/skill-docs/actionflows/references/components/document/DocumentMove.md +17 -0
  135. package/skill-docs/actionflows/references/components/document/DocumentPermissionChange.md +17 -0
  136. package/skill-docs/actionflows/references/components/document/DocumentRenewal.md +17 -0
  137. package/skill-docs/actionflows/references/components/document/DocumentRevert.md +17 -0
  138. package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -0
  139. package/skill-docs/actionflows/references/components/document/DocumentSubscription.md +17 -0
  140. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionApprove.md +17 -0
  141. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionSendBack.md +17 -0
  142. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionWithdraw.md +17 -0
  143. package/skill-docs/actionflows/references/components/document/FileFolderSave.md +17 -0
  144. package/skill-docs/actionflows/references/components/document/GetAttachmentInfo.md +17 -0
  145. package/skill-docs/actionflows/references/components/document/GetDocumentInfo.md +17 -0
  146. package/skill-docs/actionflows/references/components/document/ModifyDocumentStatus.md +17 -0
  147. package/skill-docs/actionflows/references/components/document/ReplaceAttachment.md +17 -0
  148. package/skill-docs/actionflows/references/components/document/UpdatePrintNum.md +17 -0
  149. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +39 -0
  150. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +21 -0
  151. package/skill-docs/actionflows/references/components/ebuilder/ActionEbRecover.md +17 -0
  152. package/skill-docs/actionflows/references/components/ebuilder/ActionEbSaveVersion.md +17 -0
  153. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +21 -0
  154. package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +17 -0
  155. package/skill-docs/actionflows/references/components/ebuilder/EbGetDataById.md +17 -0
  156. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +75 -0
  157. package/skill-docs/actionflows/references/components/ebuilder/EventFormData.md +17 -0
  158. package/skill-docs/actionflows/references/components/ebuilder/TimeBatchTrigger.md +17 -0
  159. package/skill-docs/actionflows/references/components/logic/Condition.md +23 -0
  160. package/skill-docs/actionflows/references/components/logic/LogicFlowSet.md +17 -0
  161. package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -0
  162. package/skill-docs/actionflows/references/components/logic/Output.md +17 -0
  163. package/skill-docs/actionflows/references/components/message/SendMessage.md +17 -0
  164. package/skill-docs/actionflows/references/components/personnel/AlterPersonStatus.md +30 -0
  165. package/skill-docs/actionflows/references/components/personnel/HrmEmployeeUpdate.md +32 -0
  166. package/skill-docs/actionflows/references/components/personnel/PersonnelOnboarding.md +34 -0
  167. package/skill-docs/actionflows/references/components/trigger/SimpleScheduler.md +17 -0
  168. package/skill-docs/actionflows/references/components/workflow/ApproveAddSign.md +17 -0
  169. package/skill-docs/actionflows/references/components/workflow/ApproveAgreeRejectApply.md +17 -0
  170. package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -0
  171. package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +17 -0
  172. package/skill-docs/actionflows/references/components/workflow/ApproveConsulTurnTodo.md +17 -0
  173. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +17 -0
  174. package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +17 -0
  175. package/skill-docs/actionflows/references/components/workflow/ApproveDoCirculate.md +17 -0
  176. package/skill-docs/actionflows/references/components/workflow/ApproveDoForward.md +17 -0
  177. package/skill-docs/actionflows/references/components/workflow/ApproveDoTurnTodo.md +17 -0
  178. package/skill-docs/actionflows/references/components/workflow/ApproveEntrust.md +17 -0
  179. package/skill-docs/actionflows/references/components/workflow/ApproveIntervention.md +17 -0
  180. package/skill-docs/actionflows/references/components/workflow/ApproveMandatoryArchiving.md +17 -0
  181. package/skill-docs/actionflows/references/components/workflow/ApproveManualCC.md +17 -0
  182. package/skill-docs/actionflows/references/components/workflow/ApproveRefuseRejectApply.md +17 -0
  183. package/skill-docs/actionflows/references/components/workflow/ApproveRejectApply.md +17 -0
  184. package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +17 -0
  185. package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -0
  186. package/skill-docs/actionflows/references/components/workflow/ApproveShareEntry.md +17 -0
  187. package/skill-docs/actionflows/references/components/workflow/ApproveTrigger.md +49 -0
  188. package/skill-docs/actionflows/references/components/workflow/ApproveWithdraw.md +17 -0
  189. package/skill-docs/actionflows/references/components/workflow/WorkFlowDocEmpowerment.md +17 -0
  190. package/skill-docs/actionflows/references/components/workflow/WorkflowToDoc.md +17 -0
  191. package/skill-docs/actionflows/references/condition_rules.md +97 -0
  192. package/skill-docs/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1046 -0
  193. package/skill-docs/actionflows/references/function_rules.md +13 -0
  194. package/skill-docs/actionflows/references/trigger_runtime_notes.md +51 -0
  195. package/skill-docs/assets/sample/.claude/settings.local.json +8 -0
  196. package/skill-docs/assets/sample/api/formApi.js +510 -0
  197. package/skill-docs/assets/sample/config/config.js +0 -0
  198. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  199. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  200. package/skill-docs/assets/sample/config/config_default.js +0 -0
  201. package/skill-docs/assets/sample/entry.js +22 -0
  202. package/skill-docs/assets/sample/eslint.config.cjs +48 -0
  203. package/skill-docs/assets/sample/memo.md +0 -0
  204. package/skill-docs/assets/sample/readme.js +8 -0
  205. package/skill-docs/references/auth/guide-auth.md +88 -0
  206. package/skill-docs/references/coding/guide-edit-backfill.md +189 -0
  207. package/skill-docs/references/coding/guide-form-crud.md +262 -0
  208. package/skill-docs/references/coding/guide-page-code.md +224 -0
  209. package/skill-docs/references/coding/guide-page-export.md +119 -0
  210. package/skill-docs/references/coding/ref-compile-rules.md +106 -0
  211. package/skill-docs/references/common/ref-cli-commands.md +286 -0
  212. package/skill-docs/references/components/@weapp-Button.md +104 -0
  213. package/skill-docs/references/components/base-Badge.md +100 -0
  214. package/skill-docs/references/components/base-Dialog.md +358 -0
  215. package/skill-docs/references/components/base-Empty.md +58 -0
  216. package/skill-docs/references/components/base-Tag.md +112 -0
  217. package/skill-docs/references/components/display-Alert.md +64 -0
  218. package/skill-docs/references/components/display-Avatar.md +150 -0
  219. package/skill-docs/references/components/display-Calendar.md +263 -0
  220. package/skill-docs/references/components/display-Carousel.md +115 -0
  221. package/skill-docs/references/components/display-Collapse.md +299 -0
  222. package/skill-docs/references/components/display-FilePreview.md +49 -0
  223. package/skill-docs/references/components/display-Icon.md +66 -0
  224. package/skill-docs/references/components/display-List.md +320 -0
  225. package/skill-docs/references/components/display-Pagination.md +41 -0
  226. package/skill-docs/references/components/display-Spin.md +34 -0
  227. package/skill-docs/references/components/display-Steps.md +89 -0
  228. package/skill-docs/references/components/display-Table.md +160 -0
  229. package/skill-docs/references/components/display-Title.md +117 -0
  230. package/skill-docs/references/components/form-Checkbox.md +161 -0
  231. package/skill-docs/references/components/form-DepartmentBrowser-api.md +52 -0
  232. package/skill-docs/references/components/form-EmployeeBrowser-api.md +51 -0
  233. package/skill-docs/references/components/form-EmployeeBrowser.md +51 -0
  234. package/skill-docs/references/components/form-Input.md +123 -0
  235. package/skill-docs/references/components/form-Radio.md +145 -0
  236. package/skill-docs/references/components/form-Select.md +191 -0
  237. package/skill-docs/references/components/form-Switch.md +46 -0
  238. package/skill-docs/references/components/form-Upload.md +53 -0
  239. package/skill-docs/references/components/generic-Echarts.md +102 -0
  240. package/skill-docs/references/form/guide-create-form.md +407 -0
  241. package/skill-docs/references/form/guide-ebuilder-filter.md +73 -0
  242. package/skill-docs/references/form/guide-ebuilder-scope.md +82 -0
  243. package/skill-docs/references/form/guide-form-data.md +48 -0
  244. package/skill-docs/references/form/guide-form-formula-functions.md +297 -0
  245. package/skill-docs/references/form/guide-form-linkage.md +185 -0
  246. package/skill-docs/references/form/guide-form-view-permission.md +38 -0
  247. package/skill-docs/references/form/guide-form-view.md +267 -0
  248. package/skill-docs/references/form/style-templates.md +44 -0
  249. package/skill-docs/references/hrm/guide-matrix.md +103 -0
  250. package/skill-docs/references/menu/system-menus.md +63 -0
  251. package/skill-docs/references/workflow/guide-workflow-action.md +168 -0
  252. package/skill-docs/references/workflow/guide-workflow-condition.md +405 -0
  253. package/skill-docs/references/workflow/guide-workflow.md +388 -0
  254. package/skill-docs/references/workflow/operator-matrix.md +74 -0
@@ -0,0 +1,13 @@
1
+ # 标准函数规则
2
+
3
+ `custom`(自定义 JS)和 `code`(编码函数)不支持跨环境生成。其余标准函数内置名称、类别和参数约束。
4
+
5
+ 需要计算、转换或拼接时,函数树可用于组件明确支持的公式属性:e-builder 的 `formula` 字段、流程/文档的 `formula_or_reference` 字段,以及 `ApproveCreate.requestName`。写法统一为:
6
+
7
+ ```json
8
+ {"kind":"function","name":"CONCAT","args":[{"kind":"fixed","value":"项目-"},{"kind":"context","paramKey":"<真实字段paramKey>","label":"项目名称"}]}
9
+ ```
10
+
11
+ 函数参数可为 `fixed`、`context`、`system_variable` 或嵌套 `function`。生成时仅对实际使用的函数调用当前租户接口,校验可用性并获取当次函数 ID。
12
+
13
+ 消息标题/内容、循环和条件各有专用 DTO;只有对应组件说明明确支持函数树时才使用,不能因为它们也显示“动态赋值”就套用通用函数结构。
@@ -0,0 +1,51 @@
1
+ # 触发器运行时注意事项(真机验证)
2
+
3
+ 本文沉淀验收 1(11 场景)真机验证得到的、与平台接口客观行为相关的经验,宿主 agent 生成 `semantic_plan` 时必须遵守。这些事实与实现语言无关(Python/Node 版同源)。
4
+
5
+ ## 1. 「数据ID」paramKey 格式因触发器而异(最关键)
6
+
7
+ 「按数据ID更新/引用当前数据」场景中,数据ID 字段的 paramKey **不是统一的 `{formId}.id`**,三种触发器各不相同:
8
+
9
+ | 触发器 | 数据ID 的 paramKey | 说明 |
10
+ |---|---|---|
11
+ | `TimeBatchTrigger` | `{formId}.id` | 例:`1300502645411717121.id` |
12
+ | `DateTrigger` | `dataResponse.id` | 前缀是 `dataResponse.`,不是表单 id |
13
+ | `EventFormData` | `{formId}.5` | **数据ID 是数字 `5`,不是 `.id`!** 极易踩坑 |
14
+
15
+ 生成 plan 时,`mapping` 源侧引用「数据ID」必须按上表写真实 paramKey,否则 preflight 的源字段校验会报「源字段 paramKey 未在真实上下文中找到」。
16
+
17
+ > 最稳妥的做法:先跑 `workflow-context-fields` 查该触发器在当前数据源下的真实上下文,从返回里确认「数据ID」的精确 paramKey,再写入 plan,不要凭记忆猜格式。
18
+
19
+ ## 2. queryFields 需包含系统字段
20
+
21
+ 定时/批量/日期触发器的 `queryFields` 全选时,除了业务字段,还必须包含**平台系统字段**(数据ID / 标题 / 创建者 / 创建时间 等 9 个)。否则 `getComponentContext` 返回的上下文中**缺少「数据ID」**,导致「按数据ID更新」引用失败。
22
+
23
+ 系统字段的 `id` 是英文字符串(`id`/`name`/`creator`/`createTime`/`lastUpdateTime`/`lastUpdater`/`dataStatus`/`myTag`/`publicTag`),`content` 是中文名。宿主 agent 侧无需手动列全,但需知晓:**数据ID 属于系统字段,不随业务字段自动出现**。
24
+
25
+ ## 3. 动态人员引用用 `context`,不要用 `{userid}`
26
+
27
+ 触发器/新建流程等节点的 `operator`(操作人)需要动态引用某字段值时,用**上下文引用**而非系统变量:
28
+
29
+ ```json
30
+ {"type": "context", "paramKey": "<formId>.<人员字段id>", "label": "<字段名>"}
31
+ ```
32
+
33
+ `{userid}` 这类系统变量在 `resolveFixedPeople` 阶段会被当作「固定人员」去查浏览器解析,失败即拦截报错。动态人员一律走 context 引用。
34
+
35
+ ## 4. filterCondition 的 `esbAssign.wId` 必须指向「当前节点」(真机验证 2026-08-18)
36
+
37
+ `ActionEbUpdate` 等数据动作的筛选条件(filterCondition)右值走上下文引用时,条件对象里的 `esbAssign.wId` 字段**必须指向「当前节点」**(filterInput 所属的数据动作节点 id),**不能指向上游 event 节点**。
38
+
39
+ - 设计器打开「动态赋值」对话框时,用 `esbAssign.wId` 在 `orginFlowDatas` 里定位当前组件;指向 event 节点 → 定位不到 → 右侧「暂无数据」(EmptyView,不可编辑/不可选)。
40
+ - `value.source` / `config.comId` 仍指向 event 节点(公式来源,不变);只有 `esbAssign.wId` 单独用当前节点 id。
41
+ - 判断口径:读回后 `esbAssign.wId` 应等于该 ActionEbAdd/Update/Delete 节点的 `id`,不等于 `event.id`。
42
+
43
+ ## 4b. 同类问题全量修复:mapping / updateId / basisValue / 明细依据值下级 / updateFieldCondition / requestName 的上下文公式也要 `esbAssign.wId`(真机验证 2026-08-18)
44
+
45
+ 第 4 节最初只修了 `filterCondition`(`buildFilterInput` 路径)。验收 1 重跑时发现:**ActionEbAdd/Update 的字段映射(mapping)、按数据 ID 更新的 `updateId`、批量新增依据值 `basisValueFormula`/`setting.bassisValue`、明细映射的 type=10 依据值下级、`updateFieldCondition` 的 assign、ApproveCreate 的 `requestName`** —— 这些位置的上下文公式(type 3/8/10)**同样必须带 `esbAssign.wId` 指向当前数据动作节点**,否则设计器打开「动态赋值」会把该条显示为「【组件名(已删除)】」(组件未删除,只是 wId 缺失导致前端定位不到当前组件)。
46
+
47
+ - 修复(2026-08-18):`formula_service.ts` 新增 `attachEsbAssign(bean, meta, fallbackSource)`,在 `buildSettingEntry` 的 context 分支(含提前 return 的 assignFlatEsbChild 子表路径)与统一 return 前、`workflow_compiler.ts` 的 `_updateId`/`_basisValueFormula`/`handleBasisValue`/`requestName`、`action_eb_update_compiler.ts` 的 `buildUpdateFieldCondition` 处统一调用。wId 取值顺序与 filterInput 一致:`meta._upstream_node_id`(convertNode 设的当前节点 id)→ 公式 `source` → `meta._upstream_w_id` → 时间戳前缀。
48
+ - 固定值(type=1)不加 esbAssign(设计器 fixvalue 不需要定位当前组件)。
49
+ - 真机回归:验收 1 全 12 场景 readBack 通过;抽查 S1(basisValue+主表映射+type10 下级)/S2(filterInput+主表映射+明细 type10)/S10(updateId)/S11(ApproveCreate formData)/S12(updateId+累加 mapping)—— 所有 esbAssign.wId == 当前数据动作节点 id,无一处指向 event。
50
+ - 新增/维护组件时,凡生成上下文公式的地方都要过一遍 `attachEsbAssign`;`actionflows/references/components/` 下各组件契约 md 与 SKILL.md「esbAssign.wId」条目已同步。
51
+
@@ -0,0 +1,8 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(python *)",
5
+ "Bash(ecodecmd build *)"
6
+ ]
7
+ }
8
+ }
@@ -0,0 +1,510 @@
1
+ import { appInfo } from '@weapp/utils';
2
+ const { publicUrl } = appInfo('@weapp/ecodesdk');
3
+ const API_BASE = `${publicUrl}/api/ebuilder/form/dataset`;
4
+
5
+ /**
6
+ * Fetches data with a timeout and retry mechanism.
7
+ * @param {string} url - The URL to fetch.
8
+ * @param {RequestInit} options - Fetch options.
9
+ * @param {number} [timeoutMs=5000] - Timeout in milliseconds.
10
+ * @param {number} [retries=3] - Number of retries.
11
+ * @returns {Promise<Response>}
12
+ */
13
+ async function fetchWithRetry(url, options, timeoutMs = 5000, retries = 3) {
14
+ let lastError;
15
+
16
+ for (let i = 0; i <= retries; i++) {
17
+ const controller = new AbortController();
18
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
19
+
20
+ try {
21
+ const response = await fetch(url, {
22
+ ...options,
23
+ signal: controller.signal,
24
+ });
25
+
26
+ clearTimeout(timeoutId);
27
+ return response;
28
+ } catch (error) {
29
+ clearTimeout(timeoutId);
30
+ lastError = error;
31
+
32
+ // If it's the last attempt, throw the error
33
+ if (i === retries) {
34
+ throw new Error(`Request failed after ${retries + 1} attempts. Last error: ${lastError.message}`);
35
+ }
36
+
37
+ // Optional: Add exponential backoff or simple delay before retrying
38
+ await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
39
+ }
40
+ }
41
+
42
+ // This line should theoretically not be reached due to the throw above
43
+ throw lastError;
44
+ }
45
+
46
+ /**
47
+ * 获取字段定义
48
+ * @param {string} objId
49
+ * @param {string} userId
50
+ * @returns {Promise<Array>}
51
+ */
52
+ export async function getFields(objId, userId) {
53
+ const response = await fetchWithRetry(`${API_BASE}/v1/getFields`, {
54
+ method: 'POST',
55
+ headers: { 'Content-Type': 'application/json' },
56
+ body: JSON.stringify({
57
+ userid: userId,
58
+ objId: objId,
59
+ tenantKey: TENANTKEY,
60
+ }),
61
+ });
62
+
63
+ const result = await response.json();
64
+
65
+ if (result.message.code !== '0') {
66
+ throw new Error(`获取字段失败: ${result.message.msg}`);
67
+ }
68
+
69
+ // 按 number 排序,保持表单原始顺序
70
+ return result.data.mainFields.sort((a, b) => a.number - b.number);
71
+ }
72
+
73
+ /**
74
+ * 获取所有数据
75
+ * @param {string} objId
76
+ * @param {string} userId
77
+ * @returns {Promise<Array>}
78
+ */
79
+ const TENANTKEY = TEAMS.currentTenant.tenantKey
80
+ export async function getAllData(objId, userId) {
81
+ const response = await fetchWithRetry(`${API_BASE}/v2/getAllData?tenantkey=${TENANTKEY}`, {
82
+ method: 'POST',
83
+ headers: { 'Content-Type': 'application/json' },
84
+ body: JSON.stringify({
85
+ userid: userId,
86
+ datajson: {
87
+ header: { objId: objId },
88
+ },
89
+ }),
90
+ });
91
+
92
+ const result = await response.json();
93
+
94
+ if (result.message.code !== '0') {
95
+ throw new Error(`获取数据失败: ${result.message.msg}`);
96
+ }
97
+
98
+ return result.data.datajson.datas || [];
99
+ }
100
+
101
+ // ==================== 数据解析函数 ====================
102
+
103
+ /**
104
+ * 解析单个字段的值
105
+ * @param {any} value
106
+ * @param {Object} fieldDef
107
+ * @returns {Object} ParsedValue
108
+ */
109
+ export function parseFieldValue(value, fieldDef) {
110
+ // 处理 undefined 或 null 值
111
+ if (!value) {
112
+ return { displayValue: '', rawValue: value };
113
+ }
114
+
115
+ // 处理数组类型(Select, RadioBox, CheckBox 等多选/单选)
116
+ if (Array.isArray(value)) {
117
+ if (value.length === 0) {
118
+ return { displayValue: '', rawValue: [] };
119
+ }
120
+
121
+ // 提取选项名称列表
122
+ const optionNames = value
123
+ .map(v => v?.fieldOptionName || v?.fieldValue || '')
124
+ .filter(v => v);
125
+
126
+ const options = value.map(v => ({
127
+ id: v?.fieldOptionId || '',
128
+ name: v?.fieldOptionName || v?.fieldValue || '',
129
+ }));
130
+
131
+ return {
132
+ displayValue: optionNames.join(', '),
133
+ rawValue: value,
134
+ options: options,
135
+ };
136
+ }
137
+
138
+ // 处理普通对象
139
+ const fieldType = fieldDef.fieldType;
140
+
141
+ switch (fieldType) {
142
+ case 'Employee':
143
+ // 员工字段可能返回用户ID或姓名
144
+ return {
145
+ displayValue: value.fieldValue || '',
146
+ rawValue: value,
147
+ };
148
+ case 'Date':
149
+ // 日期格式化
150
+ const dateValue = value.fieldValue;
151
+ if (dateValue && dateValue.includes('-')) {
152
+ return { displayValue: dateValue, rawValue: value };
153
+ }
154
+ return { displayValue: dateValue || '', rawValue: value };
155
+ case 'Number':
156
+ return {
157
+ displayValue: value.fieldValue || '0',
158
+ rawValue: value,
159
+ };
160
+ case 'Select':
161
+ case 'RadioBox':
162
+ return {
163
+ displayValue: value.fieldOptionName || value.fieldValue || '',
164
+ rawValue: value,
165
+ };
166
+ default:
167
+ return {
168
+ displayValue: value.fieldValue || '',
169
+ rawValue: value,
170
+ };
171
+ }
172
+ }
173
+
174
+ // ==================== 数据格式转换函数 ====================
175
+
176
+ /**
177
+ * 将API返回的复杂数据结构转换为简单的键值对格式
178
+ * @param {Array} dataRows
179
+ * @param {Array} fields
180
+ * @returns {Array<SimpleDataItem>}
181
+ */
182
+ export function transformToSimpleFormat(dataRows, fields) {
183
+ if (!dataRows || !dataRows.length) return [];
184
+ // Create a map for quick lookup: fieldId -> FieldDefinition
185
+ const fieldMap = new Map();
186
+ fields.forEach(field => {
187
+ fieldMap.set(field.fieldId, field);
188
+ });
189
+
190
+ return dataRows.map(row => {
191
+ const simpleItem = {};
192
+
193
+ // Copy row-level id (data ID) to simple item
194
+ if (row.id) {
195
+ simpleItem.id = row.id;
196
+ }
197
+
198
+ // Process mainTable
199
+ if (row.mainTable) {
200
+ Object.entries(row.mainTable).forEach(([key, value]) => {
201
+ // Handle the special 'id' field in mainTable
202
+ if (key === 'id' && value && typeof value === 'object') {
203
+ simpleItem.id = value.fieldValue || value.fieldOptionName || '';
204
+ return;
205
+ }
206
+
207
+ let actualFieldId;
208
+ let parsedValue;
209
+
210
+ // Case 1: Value is an object/array containing fieldId (Standard dynamic form structure)
211
+ if (value && typeof value === 'object') {
212
+ if (Array.isArray(value)) {
213
+ // For arrays (like RadioBox/Select), the fieldId is usually in the first item
214
+ actualFieldId = value[0]?.fieldId;
215
+ } else {
216
+ // For objects (like TextArea, Number), the fieldId is directly on the object
217
+ actualFieldId = value.fieldId;
218
+ }
219
+ }
220
+ // Case 2: Value is a primitive (fallback)
221
+ else {
222
+ actualFieldId = key;
223
+ }
224
+
225
+ // Find the field definition using the extracted actualFieldId
226
+ const fieldDef = actualFieldId ? fieldMap.get(actualFieldId) : undefined;
227
+
228
+ // Determine the key: Use fieldId if available, otherwise fallback to original key
229
+ const resultKey = fieldDef ? fieldDef.fieldId : key;
230
+
231
+ // Parse the value using the correct field definition
232
+ // Fallback definition if fieldDef is missing
233
+ const fallbackDef = {
234
+ id: 0,
235
+ fieldId: actualFieldId || key,
236
+ fieldName: resultKey,
237
+ fieldType: 'String',
238
+ fieldKey: 'Text',
239
+ number: 0,
240
+ multiSelect: false,
241
+ objId: 0
242
+ };
243
+
244
+ parsedValue = parseFieldValue(value, fieldDef || fallbackDef);
245
+
246
+ // Assign to result using the fieldId as the key
247
+ let finalValue = parsedValue.displayValue;
248
+
249
+ // 特殊类型统一返回 fieldOptionId(写入和组件回显需要的 ID)
250
+ // Select/RadioBox/CheckBox → 选项ID, Employee → 人员ID, Department → 部门ID, FileComponent → 文件ID
251
+ // 如需显示名称,配合 getFieldOptions 或从 uploadedFiles/selectedPerson 状态中获取
252
+ const fieldType = fieldDef?.fieldType;
253
+ const isIdType = fieldType === 'Select' || fieldType === 'RadioBox' || fieldType === 'CheckBox'
254
+ || fieldType === 'Employee' || fieldType === 'Department' || fieldType === 'FileComponent';
255
+
256
+ if (isIdType) {
257
+ if (Array.isArray(value)) {
258
+ const ids = value
259
+ .map((v) => v?.fieldOptionId)
260
+ .filter((id) => id !== undefined && id !== null && id !== '');
261
+
262
+ finalValue = ids.length > 0 ? ids.join(',') : '';
263
+ } else if (value && typeof value === 'object') {
264
+ finalValue = value.fieldOptionId ? String(value.fieldOptionId) : '';
265
+ }
266
+ }
267
+
268
+ simpleItem[actualFieldId] = finalValue;
269
+ });
270
+ }
271
+
272
+ return simpleItem;
273
+ });
274
+ }
275
+
276
+ /**
277
+ * 获取转换后的简单格式数据
278
+ * @param {string} objId
279
+ * @param {string} userId
280
+ * @returns {Promise<Array<SimpleDataItem>>}
281
+ */
282
+ export async function getSimpleData(objId, userId) {
283
+ const [fields, dataRows] = await Promise.all([
284
+ getFields(objId, userId),
285
+ getAllData(objId, userId)
286
+ ]);
287
+ const result = transformToSimpleFormat(dataRows, fields);
288
+ return result;
289
+ }
290
+
291
+ // ==================== ID → 名称映射(用于表格展示) ====================
292
+
293
+ /**
294
+ * 将 simpleData 中 Select/Employee/Department 等字段的 ID 替换为显示名称。
295
+ * getSimpleData 返回的是 ID(用于写入),表格展示需要名称,用此函数转换。
296
+ *
297
+ * @param {Array<Object>} simpleData — getSimpleData 的返回值
298
+ * @param {Object} optionsMap — { fieldId: [{valueKey, name}, ...] },valueKey→name 的映射表
299
+ * @returns {Array<Object>} 字段值为显示名称的新数组
300
+ *
301
+ * 用法:
302
+ * var [data, setData] = useState([]);
303
+ * useEffect(function () {
304
+ * Promise.all([
305
+ * getSimpleData(OBJ_ID, USER_ID),
306
+ * getFieldOptions(F.status, FORM_ID),
307
+ * ]).then(function ([rows, statusOpts]) {
308
+ * setData(withDisplayNames(rows, { [F.status]: statusOpts }));
309
+ * });
310
+ * }, []);
311
+ */
312
+ export function withDisplayNames(simpleData, optionsMap) {
313
+ return simpleData.map(function (row) {
314
+ var displayRow = {};
315
+ Object.keys(row).forEach(function (key) {
316
+ var options = optionsMap[key];
317
+ if (options && options.length) {
318
+ var ids = (row[key] || '').split(',');
319
+ displayRow[key] = ids.map(function (id) {
320
+ var opt = options.find(function (o) { return o.valueKey === id; });
321
+ return opt ? opt.name : id;
322
+ }).join(', ');
323
+ } else {
324
+ displayRow[key] = row[key];
325
+ }
326
+ });
327
+ return displayRow;
328
+ });
329
+ }
330
+
331
+ // ==================== 保存表单数据 ====================
332
+
333
+ /**
334
+ * 保存表单数据
335
+ * @param {string} objId
336
+ * @param {Object} formData
337
+ * @param {string} userId
338
+ * @returns {Promise<Object>}
339
+ */
340
+ export async function saveFormData(objId, formData, userId) {
341
+ const requestData = {
342
+ userid: userId,
343
+ datajson: {
344
+ datas: {
345
+ mainTable: formData,
346
+ operationinfo: {
347
+ doAction: 'n', // 新增操作
348
+ optionNoFindIgnore: 'false'
349
+ }
350
+ },
351
+ header: {
352
+ objId: objId,
353
+ tenantKey: TENANTKEY
354
+ }
355
+ }
356
+ };
357
+
358
+ const response = await fetchWithRetry(`${API_BASE}/v1/saveFormData`, {
359
+ method: 'POST',
360
+ headers: {
361
+ 'Content-Type': 'application/json'
362
+ },
363
+ body: JSON.stringify(requestData),
364
+ });
365
+
366
+ const result = await response.json();
367
+ if (result.data && result.data.isSuccess === false) {
368
+ throw new Error('保存失败: ' + (result.data.msg || JSON.stringify(result.data)));
369
+ }
370
+ if (result.message && result.message.code !== '0') {
371
+ throw new Error('保存失败: ' + (result.message.msg || JSON.stringify(result.message)));
372
+ }
373
+ return result;
374
+ }
375
+
376
+ // ==================== 更新表单数据 ====================
377
+
378
+ /**
379
+ * 更新表单数据
380
+ * @param {string} objId
381
+ * @param {Object} formData
382
+ * @param {string} dataId - 数据ID
383
+ * @param {string} userId
384
+ * @returns {Promise<Object>}
385
+ */
386
+ export async function updateFormData(objId, formData, dataId, userId) {
387
+ const requestData = {
388
+ userid: userId,
389
+ datajson: {
390
+ datas: {
391
+ mainTable: Object.assign({ id: dataId }, formData),
392
+ operationinfo: {
393
+ doAction: 'u',
394
+ optionNoFindIgnore: 'false'
395
+ }
396
+ },
397
+ header: {
398
+ objId: objId,
399
+ tenantKey: TENANTKEY
400
+ }
401
+ }
402
+ };
403
+
404
+ const response = await fetchWithRetry(`${API_BASE}/v1/saveFormData`, {
405
+ method: 'POST',
406
+ headers: {
407
+ 'Content-Type': 'application/json'
408
+ },
409
+ body: JSON.stringify(requestData),
410
+ });
411
+
412
+ const result = await response.json();
413
+ if (result.data && result.data.isSuccess === false) {
414
+ throw new Error('更新失败: ' + (result.data.msg || JSON.stringify(result.data)));
415
+ }
416
+ if (result.message && result.message.code !== '0') {
417
+ throw new Error('更新失败: ' + (result.message.msg || JSON.stringify(result.message)));
418
+ }
419
+ return result;
420
+ }
421
+
422
+ // ==================== 删除表单数据 ====================
423
+
424
+ /**
425
+ * 删除表单数据
426
+ * @param {string} objId - 表单ID (objId)
427
+ * @param {string|number} dataId - 数据ID
428
+ * @param {string} userId - User ID
429
+ * @returns {Promise<Object>}
430
+ */
431
+ export async function deleteFormData(objId, dataId, userId) {
432
+ const requestData = {
433
+ userid: userId,
434
+ datajson: {
435
+ header: {
436
+ objId: objId
437
+ },
438
+ mainTable: {
439
+ id: dataId
440
+ },
441
+ operationinfo: {
442
+ fieldNoFindIgnore: 'false'
443
+ }
444
+ }
445
+ };
446
+
447
+ const response = await fetchWithRetry(`${API_BASE}/v2/deleteData`, {
448
+ method: 'POST',
449
+ headers: {
450
+ 'Content-Type': 'application/json'
451
+ },
452
+ body: JSON.stringify(requestData),
453
+ });
454
+
455
+ const result = await response.json();
456
+
457
+ if (result.message.code !== '0') {
458
+ throw new Error(`删除数据失败: ${result.message.msg}`);
459
+ }
460
+
461
+ return result;
462
+ }
463
+
464
+ // ==================== 获取选项字段的具体选项值 ====================
465
+ export async function getFieldOptions(fieldId, objId) {
466
+ // 注意:第二个参数是 objId(表单对象 ID),与 getSimpleData/saveFormData 用的是同一个值
467
+ const infoUrl = `${publicUrl}/api/ebuilder/form/obj/getInfo/${objId}`;
468
+ const infoResponse = await fetchWithRetry(infoUrl, {
469
+ method: 'GET',
470
+ headers: { 'Content-Type': 'application/json' },
471
+ });
472
+ const infoResult = await infoResponse.json();
473
+ if (infoResult.code !== 200 || !infoResult.status) {
474
+ throw new Error(`获取表单信息失败: ${infoResult.msg || 'Unknown error'}`);
475
+ }
476
+ const formIdNew = infoResult.data?.formId;
477
+
478
+ if (!formIdNew) {
479
+ throw new Error('未能从表单信息中获取有效的 formId');
480
+ }
481
+
482
+ const url = `${publicUrl}/api/ebuilder/form/form/field/manage/getFormField`;
483
+ const requestBody = {
484
+ module: "ebuilderform",
485
+ formTableField: {
486
+ formField: {
487
+ id: fieldId,
488
+ form: {
489
+ id: formIdNew // Use the dynamically fetched formId
490
+ }
491
+ }
492
+ }
493
+ };
494
+ const response = await fetchWithRetry(url, {
495
+ method: 'POST',
496
+ headers: { 'Content-Type': 'application/json' },
497
+ body: JSON.stringify(requestBody),
498
+ });
499
+
500
+ const result = await response.json();
501
+ if (result.code !== 200 || !result.status) {
502
+ throw new Error(`获取字段选项失败: ${result.msg || 'Unknown error'}`);
503
+ }
504
+
505
+ const options = result.data?.options || [];
506
+ return options.map(option => ({
507
+ valueKey: option.valueKey,
508
+ name: option.name
509
+ }));
510
+ }
File without changes
File without changes
@@ -0,0 +1,22 @@
1
+ import React, { useState, useEffect, Suspense } from 'react';
2
+ import { Route } from 'react-router-dom';
3
+ import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
4
+ import { getSimpleData } from './api/formApi.js';
5
+ import { asyncImport } from '@weapp/ecodesdk';
6
+
7
+ // 初始的空白模板项目
8
+ const { publicUrl } = appInfo('@weapp/ecodesdk');
9
+ const extract = (
10
+ <Route path={`${publicUrl}/sp/custom/123123`}>
11
+ <React.Suspense fallback={<div>Loading...</div>}>
12
+ <>
13
+ HELLO WORLD
14
+ </>
15
+ </React.Suspense>
16
+ </Route>
17
+ );
18
+
19
+ regOvProps('weappEcodesdk', 'Switch', (props) => {
20
+ regReactChildren(props, extract);
21
+ return props;
22
+ }, 0);
@@ -0,0 +1,48 @@
1
+ module.exports = [
2
+ {
3
+ files: ["**/*.js"],
4
+ languageOptions: {
5
+ ecmaVersion: 2022,
6
+ sourceType: "module",
7
+ parserOptions: {
8
+ ecmaFeatures: { jsx: true }
9
+ },
10
+ globals: {
11
+ React: "readonly",
12
+ TEAMS: "readonly",
13
+ TENANTKEY: "readonly",
14
+ Route: "readonly",
15
+ console: "readonly",
16
+ alert: "readonly",
17
+ confirm: "readonly",
18
+ Promise: "readonly",
19
+ AbortController: "readonly",
20
+ fetch: "readonly",
21
+ setTimeout: "readonly",
22
+ clearTimeout: "readonly",
23
+ JSON: "readonly",
24
+ Object: "readonly",
25
+ Array: "readonly",
26
+ Date: "readonly",
27
+ String: "readonly",
28
+ parseInt: "readonly",
29
+ encodeURIComponent: "readonly",
30
+ Error: "readonly",
31
+ URLSearchParams: "readonly",
32
+ Map: "readonly",
33
+ document: "readonly",
34
+ window: "readonly",
35
+ FormData: "readonly",
36
+ Event: "readonly",
37
+ }
38
+ },
39
+ rules: {
40
+ "no-undef": "error",
41
+ "no-unused-vars": "warn",
42
+ "no-redeclare": "error",
43
+ "no-dupe-keys": "error",
44
+ "no-const-assign": "error",
45
+ "no-empty": "warn",
46
+ }
47
+ }
48
+ ];
File without changes
@@ -0,0 +1,8 @@
1
+ const routes = [
2
+ {
3
+ fileName: "xxx.js",
4
+ className: "xxx",
5
+ }
6
+ ];
7
+
8
+ export default routes;