weaver-e10-builder 1.0.11-beta → 1.1.0

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 (358) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +17 -3
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/auth.d.ts.map +1 -1
  5. package/dist/commands/auth.js +16 -0
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/form-association-manage.d.ts +3 -0
  8. package/dist/commands/form-association-manage.d.ts.map +1 -0
  9. package/dist/commands/form-association-manage.js +76 -0
  10. package/dist/commands/form-association-manage.js.map +1 -0
  11. package/dist/commands/form-association.d.ts.map +1 -1
  12. package/dist/commands/form-association.js +29 -25
  13. package/dist/commands/form-association.js.map +1 -1
  14. package/dist/commands/form-button.d.ts.map +1 -1
  15. package/dist/commands/form-button.js +71 -159
  16. package/dist/commands/form-button.js.map +1 -1
  17. package/dist/commands/form-field-linkage.d.ts +3 -0
  18. package/dist/commands/form-field-linkage.d.ts.map +1 -0
  19. package/dist/commands/form-field-linkage.js +300 -0
  20. package/dist/commands/form-field-linkage.js.map +1 -0
  21. package/dist/commands/form-list-columns.d.ts +3 -0
  22. package/dist/commands/form-list-columns.d.ts.map +1 -0
  23. package/dist/commands/form-list-columns.js +50 -0
  24. package/dist/commands/form-list-columns.js.map +1 -0
  25. package/dist/commands/form-list-permission.d.ts.map +1 -1
  26. package/dist/commands/form-list-permission.js +130 -15
  27. package/dist/commands/form-list-permission.js.map +1 -1
  28. package/dist/commands/form-list-stats.d.ts +0 -8
  29. package/dist/commands/form-list-stats.d.ts.map +1 -1
  30. package/dist/commands/form-list-stats.js +41 -133
  31. package/dist/commands/form-list-stats.js.map +1 -1
  32. package/dist/commands/form-list.d.ts.map +1 -1
  33. package/dist/commands/form-list.js +2 -126
  34. package/dist/commands/form-list.js.map +1 -1
  35. package/dist/commands/form-nlist.d.ts +22 -0
  36. package/dist/commands/form-nlist.d.ts.map +1 -0
  37. package/dist/commands/form-nlist.js +179 -0
  38. package/dist/commands/form-nlist.js.map +1 -0
  39. package/dist/commands/form-serial-mark.d.ts +0 -15
  40. package/dist/commands/form-serial-mark.d.ts.map +1 -1
  41. package/dist/commands/form-serial-mark.js +604 -137
  42. package/dist/commands/form-serial-mark.js.map +1 -1
  43. package/dist/commands/form.d.ts.map +1 -1
  44. package/dist/commands/form.js +207 -2
  45. package/dist/commands/form.js.map +1 -1
  46. package/dist/commands/interface.d.ts +3 -0
  47. package/dist/commands/interface.d.ts.map +1 -0
  48. package/dist/commands/interface.js +51 -0
  49. package/dist/commands/interface.js.map +1 -0
  50. package/dist/commands/menu-permission.d.ts.map +1 -1
  51. package/dist/commands/menu-permission.js +133 -82
  52. package/dist/commands/menu-permission.js.map +1 -1
  53. package/dist/commands/skill.d.ts +3 -0
  54. package/dist/commands/skill.d.ts.map +1 -0
  55. package/dist/commands/skill.js +112 -0
  56. package/dist/commands/skill.js.map +1 -0
  57. package/dist/commands/update.d.ts +13 -0
  58. package/dist/commands/update.d.ts.map +1 -0
  59. package/dist/commands/update.js +101 -0
  60. package/dist/commands/update.js.map +1 -0
  61. package/dist/commands/workflow-condition.d.ts.map +1 -1
  62. package/dist/commands/workflow-condition.js +3 -1
  63. package/dist/commands/workflow-condition.js.map +1 -1
  64. package/dist/commands/workflow-node-empty-handle.d.ts +13 -0
  65. package/dist/commands/workflow-node-empty-handle.d.ts.map +1 -0
  66. package/dist/commands/workflow-node-empty-handle.js +137 -0
  67. package/dist/commands/workflow-node-empty-handle.js.map +1 -0
  68. package/dist/commands/workflow.d.ts.map +1 -1
  69. package/dist/commands/workflow.js +101 -25
  70. package/dist/commands/workflow.js.map +1 -1
  71. package/dist/index.js +12 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/postinstall.d.ts +2 -0
  74. package/dist/postinstall.d.ts.map +1 -0
  75. package/dist/postinstall.js +17 -0
  76. package/dist/postinstall.js.map +1 -0
  77. package/dist/services/actionflow/command_output.d.ts +4 -0
  78. package/dist/services/actionflow/command_output.d.ts.map +1 -1
  79. package/dist/services/actionflow/command_output.js +44 -0
  80. package/dist/services/actionflow/command_output.js.map +1 -1
  81. package/dist/services/actionflow/component_registry.d.ts.map +1 -1
  82. package/dist/services/actionflow/component_registry.js +5 -1
  83. package/dist/services/actionflow/component_registry.js.map +1 -1
  84. package/dist/services/actionflow/components/action_eb_add.js +1 -1
  85. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  86. package/dist/services/actionflow/components/approve_trigger.d.ts +5 -0
  87. package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
  88. package/dist/services/actionflow/components/approve_trigger.js +22 -1
  89. package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
  90. package/dist/services/actionflow/components/approve_trigger_compiler.js +2 -2
  91. package/dist/services/actionflow/components/approve_trigger_compiler.js.map +1 -1
  92. package/dist/services/actionflow/components/custom_trigger.d.ts +9 -0
  93. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -0
  94. package/dist/services/actionflow/components/custom_trigger.js +47 -0
  95. package/dist/services/actionflow/components/custom_trigger.js.map +1 -0
  96. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  97. package/dist/services/actionflow/components/enquiry_form.js +29 -3
  98. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  99. package/dist/services/actionflow/components/event_button.d.ts +3 -0
  100. package/dist/services/actionflow/components/event_button.d.ts.map +1 -0
  101. package/dist/services/actionflow/components/event_button.js +32 -0
  102. package/dist/services/actionflow/components/event_button.js.map +1 -0
  103. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  104. package/dist/services/actionflow/components/index.js +10 -0
  105. package/dist/services/actionflow/components/index.js.map +1 -1
  106. package/dist/services/actionflow/components/inner_mq_listener.d.ts +3 -0
  107. package/dist/services/actionflow/components/inner_mq_listener.d.ts.map +1 -0
  108. package/dist/services/actionflow/components/inner_mq_listener.js +40 -0
  109. package/dist/services/actionflow/components/inner_mq_listener.js.map +1 -0
  110. package/dist/services/actionflow/components/inner_mq_send.d.ts +5 -0
  111. package/dist/services/actionflow/components/inner_mq_send.d.ts.map +1 -0
  112. package/dist/services/actionflow/components/inner_mq_send.js +72 -0
  113. package/dist/services/actionflow/components/inner_mq_send.js.map +1 -0
  114. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  115. package/dist/services/actionflow/components/send_message.js +7 -4
  116. package/dist/services/actionflow/components/send_message.js.map +1 -1
  117. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  118. package/dist/services/actionflow/context_preflight.js +7 -1
  119. package/dist/services/actionflow/context_preflight.js.map +1 -1
  120. package/dist/services/actionflow/design_client.d.ts +13 -2
  121. package/dist/services/actionflow/design_client.d.ts.map +1 -1
  122. package/dist/services/actionflow/design_client.js +56 -8
  123. package/dist/services/actionflow/design_client.js.map +1 -1
  124. package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
  125. package/dist/services/actionflow/enrich_approve_trigger.js +31 -0
  126. package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
  127. package/dist/services/actionflow/form_source.d.ts +2 -0
  128. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  129. package/dist/services/actionflow/form_source.js +5 -0
  130. package/dist/services/actionflow/form_source.js.map +1 -1
  131. package/dist/services/actionflow/formula_service.d.ts +1 -1
  132. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  133. package/dist/services/actionflow/formula_service.js +118 -12
  134. package/dist/services/actionflow/formula_service.js.map +1 -1
  135. package/dist/services/actionflow/functions_catalog.d.ts +2 -1
  136. package/dist/services/actionflow/functions_catalog.d.ts.map +1 -1
  137. package/dist/services/actionflow/functions_catalog.js +2392 -180
  138. package/dist/services/actionflow/functions_catalog.js.map +1 -1
  139. package/dist/services/actionflow/functions_source.d.ts.map +1 -1
  140. package/dist/services/actionflow/functions_source.js +3 -0
  141. package/dist/services/actionflow/functions_source.js.map +1 -1
  142. package/dist/services/actionflow/generation_service.d.ts +11 -0
  143. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  144. package/dist/services/actionflow/generation_service.js +66 -23
  145. package/dist/services/actionflow/generation_service.js.map +1 -1
  146. package/dist/services/actionflow/plan_constraints.d.ts +5 -0
  147. package/dist/services/actionflow/plan_constraints.d.ts.map +1 -0
  148. package/dist/services/actionflow/plan_constraints.js +54 -0
  149. package/dist/services/actionflow/plan_constraints.js.map +1 -0
  150. package/dist/services/actionflow/preflight_service.d.ts +3 -0
  151. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  152. package/dist/services/actionflow/preflight_service.js +152 -8
  153. package/dist/services/actionflow/preflight_service.js.map +1 -1
  154. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  155. package/dist/services/actionflow/readback_verifier.js +63 -2
  156. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  157. package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
  158. package/dist/services/actionflow/save_workflow_draft.js +43 -2
  159. package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
  160. package/dist/services/actionflow/update_service.d.ts +41 -0
  161. package/dist/services/actionflow/update_service.d.ts.map +1 -0
  162. package/dist/services/actionflow/update_service.js +767 -0
  163. package/dist/services/actionflow/update_service.js.map +1 -0
  164. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  165. package/dist/services/actionflow/workflow_compiler.js +120 -12
  166. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  167. package/dist/services/condition-rules.d.ts.map +1 -1
  168. package/dist/services/condition-rules.js +3 -1
  169. package/dist/services/condition-rules.js.map +1 -1
  170. package/dist/services/esb-interface/document-parser.d.ts +6 -0
  171. package/dist/services/esb-interface/document-parser.d.ts.map +1 -0
  172. package/dist/services/esb-interface/document-parser.js +247 -0
  173. package/dist/services/esb-interface/document-parser.js.map +1 -0
  174. package/dist/services/esb-interface/importer.d.ts +9 -0
  175. package/dist/services/esb-interface/importer.d.ts.map +1 -0
  176. package/dist/services/esb-interface/importer.js +44 -0
  177. package/dist/services/esb-interface/importer.js.map +1 -0
  178. package/dist/services/esb-interface/postman-collection.d.ts +9 -0
  179. package/dist/services/esb-interface/postman-collection.d.ts.map +1 -0
  180. package/dist/services/esb-interface/postman-collection.js +125 -0
  181. package/dist/services/esb-interface/postman-collection.js.map +1 -0
  182. package/dist/services/esb-interface/types.d.ts +91 -0
  183. package/dist/services/esb-interface/types.d.ts.map +1 -0
  184. package/dist/services/esb-interface/types.js +2 -0
  185. package/dist/services/esb-interface/types.js.map +1 -0
  186. package/dist/services/form-association.d.ts +49 -0
  187. package/dist/services/form-association.d.ts.map +1 -0
  188. package/dist/services/form-association.js +279 -0
  189. package/dist/services/form-association.js.map +1 -0
  190. package/dist/services/form-button-position.d.ts +35 -0
  191. package/dist/services/form-button-position.d.ts.map +1 -0
  192. package/dist/services/form-button-position.js +109 -0
  193. package/dist/services/form-button-position.js.map +1 -0
  194. package/dist/services/form-create.d.ts.map +1 -1
  195. package/dist/services/form-create.js +4 -1
  196. package/dist/services/form-create.js.map +1 -1
  197. package/dist/services/form-list-columns.d.ts +54 -0
  198. package/dist/services/form-list-columns.d.ts.map +1 -0
  199. package/dist/services/form-list-columns.js +236 -0
  200. package/dist/services/form-list-columns.js.map +1 -0
  201. package/dist/services/form-list-stats.d.ts +44 -0
  202. package/dist/services/form-list-stats.d.ts.map +1 -0
  203. package/dist/services/form-list-stats.js +302 -0
  204. package/dist/services/form-list-stats.js.map +1 -0
  205. package/dist/services/form-nlist.d.ts +42 -0
  206. package/dist/services/form-nlist.d.ts.map +1 -0
  207. package/dist/services/form-nlist.js +332 -0
  208. package/dist/services/form-nlist.js.map +1 -0
  209. package/dist/services/skill-provision.d.ts +23 -0
  210. package/dist/services/skill-provision.d.ts.map +1 -0
  211. package/dist/services/skill-provision.js +96 -0
  212. package/dist/services/skill-provision.js.map +1 -0
  213. package/dist/services/update-check.d.ts +24 -0
  214. package/dist/services/update-check.d.ts.map +1 -0
  215. package/dist/services/update-check.js +108 -0
  216. package/dist/services/update-check.js.map +1 -0
  217. package/dist/services/workflow-initiator.js +3 -3
  218. package/dist/services/workflow-initiator.js.map +1 -1
  219. package/package.json +5 -2
  220. package/skill-docs/SKILL.md +263 -0
  221. package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +17 -0
  222. package/skill-docs/actionflows/references/components/calendar/ScheduleCreate.md +17 -0
  223. package/skill-docs/actionflows/references/components/document/AttachmentCopy.md +17 -0
  224. package/skill-docs/actionflows/references/components/document/AttachmentMove.md +17 -0
  225. package/skill-docs/actionflows/references/components/document/DocumentCopy.md +17 -0
  226. package/skill-docs/actionflows/references/components/document/DocumentDelete.md +17 -0
  227. package/skill-docs/actionflows/references/components/document/DocumentEdit.md +17 -0
  228. package/skill-docs/actionflows/references/components/document/DocumentMove.md +17 -0
  229. package/skill-docs/actionflows/references/components/document/DocumentPermissionChange.md +17 -0
  230. package/skill-docs/actionflows/references/components/document/DocumentRenewal.md +17 -0
  231. package/skill-docs/actionflows/references/components/document/DocumentRevert.md +17 -0
  232. package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -0
  233. package/skill-docs/actionflows/references/components/document/DocumentSubscription.md +17 -0
  234. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionApprove.md +17 -0
  235. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionSendBack.md +17 -0
  236. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionWithdraw.md +17 -0
  237. package/skill-docs/actionflows/references/components/document/FileFolderSave.md +17 -0
  238. package/skill-docs/actionflows/references/components/document/GetAttachmentInfo.md +17 -0
  239. package/skill-docs/actionflows/references/components/document/GetDocumentInfo.md +17 -0
  240. package/skill-docs/actionflows/references/components/document/ModifyDocumentStatus.md +17 -0
  241. package/skill-docs/actionflows/references/components/document/ReplaceAttachment.md +17 -0
  242. package/skill-docs/actionflows/references/components/document/UpdatePrintNum.md +17 -0
  243. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +61 -0
  244. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +23 -0
  245. package/skill-docs/actionflows/references/components/ebuilder/ActionEbRecover.md +17 -0
  246. package/skill-docs/actionflows/references/components/ebuilder/ActionEbSaveVersion.md +17 -0
  247. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +23 -0
  248. package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +17 -0
  249. package/skill-docs/actionflows/references/components/ebuilder/EbGetDataById.md +17 -0
  250. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +101 -0
  251. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +33 -0
  252. package/skill-docs/actionflows/references/components/ebuilder/EventFormData.md +17 -0
  253. package/skill-docs/actionflows/references/components/ebuilder/TimeBatchTrigger.md +17 -0
  254. package/skill-docs/actionflows/references/components/logic/Condition.md +23 -0
  255. package/skill-docs/actionflows/references/components/logic/LogicFlowSet.md +17 -0
  256. package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -0
  257. package/skill-docs/actionflows/references/components/logic/Output.md +17 -0
  258. package/skill-docs/actionflows/references/components/message/InnerMQSend.md +40 -0
  259. package/skill-docs/actionflows/references/components/message/SendMessage.md +17 -0
  260. package/skill-docs/actionflows/references/components/personnel/AlterPersonStatus.md +30 -0
  261. package/skill-docs/actionflows/references/components/personnel/HrmEmployeeUpdate.md +32 -0
  262. package/skill-docs/actionflows/references/components/personnel/PersonnelOnboarding.md +34 -0
  263. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +45 -0
  264. package/skill-docs/actionflows/references/components/trigger/InnerMQListener.md +40 -0
  265. package/skill-docs/actionflows/references/components/trigger/SimpleScheduler.md +17 -0
  266. package/skill-docs/actionflows/references/components/workflow/ApproveAddSign.md +17 -0
  267. package/skill-docs/actionflows/references/components/workflow/ApproveAgreeRejectApply.md +17 -0
  268. package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -0
  269. package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +17 -0
  270. package/skill-docs/actionflows/references/components/workflow/ApproveConsulTurnTodo.md +17 -0
  271. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +17 -0
  272. package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +17 -0
  273. package/skill-docs/actionflows/references/components/workflow/ApproveDoCirculate.md +17 -0
  274. package/skill-docs/actionflows/references/components/workflow/ApproveDoForward.md +17 -0
  275. package/skill-docs/actionflows/references/components/workflow/ApproveDoTurnTodo.md +17 -0
  276. package/skill-docs/actionflows/references/components/workflow/ApproveEntrust.md +17 -0
  277. package/skill-docs/actionflows/references/components/workflow/ApproveIntervention.md +17 -0
  278. package/skill-docs/actionflows/references/components/workflow/ApproveMandatoryArchiving.md +17 -0
  279. package/skill-docs/actionflows/references/components/workflow/ApproveManualCC.md +17 -0
  280. package/skill-docs/actionflows/references/components/workflow/ApproveRefuseRejectApply.md +17 -0
  281. package/skill-docs/actionflows/references/components/workflow/ApproveRejectApply.md +17 -0
  282. package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +17 -0
  283. package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -0
  284. package/skill-docs/actionflows/references/components/workflow/ApproveShareEntry.md +17 -0
  285. package/skill-docs/actionflows/references/components/workflow/ApproveTrigger.md +84 -0
  286. package/skill-docs/actionflows/references/components/workflow/ApproveWithdraw.md +17 -0
  287. package/skill-docs/actionflows/references/components/workflow/WorkFlowDocEmpowerment.md +17 -0
  288. package/skill-docs/actionflows/references/components/workflow/WorkflowToDoc.md +17 -0
  289. package/skill-docs/actionflows/references/condition_rules.md +99 -0
  290. package/skill-docs/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1043 -0
  291. package/skill-docs/actionflows/references/function_rules.md +13 -0
  292. package/skill-docs/actionflows/references/trigger_runtime_notes.md +53 -0
  293. package/skill-docs/assets/sample/.claude/settings.local.json +8 -0
  294. package/skill-docs/assets/sample/api/formApi.js +510 -0
  295. package/skill-docs/assets/sample/config/config.js +0 -0
  296. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  297. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  298. package/skill-docs/assets/sample/config/config_default.js +0 -0
  299. package/skill-docs/assets/sample/entry.js +22 -0
  300. package/skill-docs/assets/sample/eslint.config.cjs +48 -0
  301. package/skill-docs/assets/sample/memo.md +0 -0
  302. package/skill-docs/assets/sample/readme.js +8 -0
  303. package/skill-docs/references/auth/guide-auth.md +88 -0
  304. package/skill-docs/references/coding/guide-edit-backfill.md +189 -0
  305. package/skill-docs/references/coding/guide-form-crud.md +262 -0
  306. package/skill-docs/references/coding/guide-page-code.md +224 -0
  307. package/skill-docs/references/coding/guide-page-export.md +119 -0
  308. package/skill-docs/references/coding/ref-compile-rules.md +106 -0
  309. package/skill-docs/references/common/guide-plan-template.md +201 -0
  310. package/skill-docs/references/common/ref-cli-commands.md +320 -0
  311. package/skill-docs/references/components/@weapp-Button.md +104 -0
  312. package/skill-docs/references/components/base-Badge.md +100 -0
  313. package/skill-docs/references/components/base-Dialog.md +358 -0
  314. package/skill-docs/references/components/base-Empty.md +58 -0
  315. package/skill-docs/references/components/base-Tag.md +112 -0
  316. package/skill-docs/references/components/display-Alert.md +64 -0
  317. package/skill-docs/references/components/display-Avatar.md +150 -0
  318. package/skill-docs/references/components/display-Calendar.md +263 -0
  319. package/skill-docs/references/components/display-Carousel.md +115 -0
  320. package/skill-docs/references/components/display-Collapse.md +299 -0
  321. package/skill-docs/references/components/display-FilePreview.md +49 -0
  322. package/skill-docs/references/components/display-Icon.md +66 -0
  323. package/skill-docs/references/components/display-List.md +320 -0
  324. package/skill-docs/references/components/display-Pagination.md +41 -0
  325. package/skill-docs/references/components/display-Spin.md +34 -0
  326. package/skill-docs/references/components/display-Steps.md +89 -0
  327. package/skill-docs/references/components/display-Table.md +160 -0
  328. package/skill-docs/references/components/display-Title.md +117 -0
  329. package/skill-docs/references/components/form-Checkbox.md +161 -0
  330. package/skill-docs/references/components/form-DepartmentBrowser-api.md +52 -0
  331. package/skill-docs/references/components/form-EmployeeBrowser-api.md +51 -0
  332. package/skill-docs/references/components/form-EmployeeBrowser.md +51 -0
  333. package/skill-docs/references/components/form-Input.md +123 -0
  334. package/skill-docs/references/components/form-Radio.md +145 -0
  335. package/skill-docs/references/components/form-Select.md +191 -0
  336. package/skill-docs/references/components/form-Switch.md +46 -0
  337. package/skill-docs/references/components/form-Upload.md +53 -0
  338. package/skill-docs/references/components/generic-Echarts.md +102 -0
  339. package/skill-docs/references/form/guide-create-form.md +409 -0
  340. package/skill-docs/references/form/guide-ebuilder-filter.md +73 -0
  341. package/skill-docs/references/form/guide-ebuilder-scope.md +82 -0
  342. package/skill-docs/references/form/guide-field-linkage.md +121 -0
  343. package/skill-docs/references/form/guide-form-association.md +108 -0
  344. package/skill-docs/references/form/guide-form-button.md +54 -0
  345. package/skill-docs/references/form/guide-form-data.md +48 -0
  346. package/skill-docs/references/form/guide-form-formula-functions.md +297 -0
  347. package/skill-docs/references/form/guide-form-linkage.md +185 -0
  348. package/skill-docs/references/form/guide-form-view-permission.md +38 -0
  349. package/skill-docs/references/form/guide-form-view.md +284 -0
  350. package/skill-docs/references/form/guide-list-columns.md +52 -0
  351. package/skill-docs/references/form/guide-list-stats.md +83 -0
  352. package/skill-docs/references/form/style-templates.md +44 -0
  353. package/skill-docs/references/hrm/guide-matrix.md +103 -0
  354. package/skill-docs/references/menu/system-menus.md +63 -0
  355. package/skill-docs/references/workflow/guide-workflow-action.md +172 -0
  356. package/skill-docs/references/workflow/guide-workflow-condition.md +405 -0
  357. package/skill-docs/references/workflow/guide-workflow.md +402 -0
  358. package/skill-docs/references/workflow/operator-matrix.md +74 -0
@@ -0,0 +1,767 @@
1
+ /**
2
+ * 已有动作流的保留式更新。
3
+ *
4
+ * 更新不是重新生成:先读取正式设计,基于原设计执行显式操作,再用原 appId/
5
+ * sceneId 和正式回读中的原节点 ID 调用 saveDesign。未被操作覆盖的节点和属性不会被重建;
6
+ * 平台创建新版时可能重分配动作/出口 ID,回读按新版结构校验。
7
+ * 更新不得改变 event 触发器;触发器变更必须走新建动作流。正式更新始终保存为新版本。
8
+ */
9
+ import { mkdirSync, writeFileSync } from 'node:fs';
10
+ import { dirname, resolve } from 'node:path';
11
+ import { checkDesign, getApplication, getComponentsForDesign, getDesign, getVersionList, saveDesign } from './design_client.js';
12
+ import { genSfId } from './id_generator.js';
13
+ import { validateActionflowComponentConstraints } from './plan_constraints.js';
14
+ function asObject(value) {
15
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
16
+ }
17
+ function clone(value) {
18
+ return JSON.parse(JSON.stringify(value));
19
+ }
20
+ function currentEnabledState(status) {
21
+ const value = String(status ?? '').toLowerCase();
22
+ if (['start_using', 'using', 'enabled', '1', 'true'].includes(value))
23
+ return true;
24
+ if (['forbidden', 'stop_using', 'not_start', 'notusing', 'disabled', 'disable', 'draft', '0', 'false'].includes(value))
25
+ return false;
26
+ return undefined;
27
+ }
28
+ function versionEntryId(entry) {
29
+ return String(entry?.id || entry?.sceneId || entry?.versionId || '').trim();
30
+ }
31
+ function findNewVersionId(versionResponse, previousSceneId, previousVersion) {
32
+ const versions = Array.isArray(versionResponse?.data?.actionFlowVersions)
33
+ ? versionResponse.data.actionFlowVersions
34
+ : [];
35
+ const candidates = versions
36
+ .map((entry) => ({ id: versionEntryId(entry), version: Number(entry?.version || 0), updateTime: String(entry?.updateTime || '') }))
37
+ .filter((entry) => entry.id && entry.id !== previousSceneId && entry.version > previousVersion)
38
+ .sort((a, b) => b.version - a.version || b.updateTime.localeCompare(a.updateTime));
39
+ return candidates[0]?.id || '';
40
+ }
41
+ function pointerParts(path) {
42
+ if (typeof path !== 'string' || !path.startsWith('/') || path === '/')
43
+ throw new Error(`路径必须是以 / 开头的 JSON Pointer: ${path}`);
44
+ return path.slice(1).split('/').map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));
45
+ }
46
+ function pointerGet(root, path) {
47
+ return pointerParts(path).reduce((current, part) => {
48
+ if (current == null || !(part in Object(current)))
49
+ throw new Error(`路径不存在: ${path}`);
50
+ return current[part];
51
+ }, root);
52
+ }
53
+ function pointerParent(root, path) {
54
+ const parts = pointerParts(path);
55
+ const key = parts.pop();
56
+ let parent = root;
57
+ for (const part of parts) {
58
+ if (parent == null || !(part in Object(parent)))
59
+ throw new Error(`路径不存在: ${path}`);
60
+ parent = parent[part];
61
+ }
62
+ return { parent, key };
63
+ }
64
+ function deepMerge(target, patch) {
65
+ if (!patch || typeof patch !== 'object' || Array.isArray(patch))
66
+ return clone(patch);
67
+ const result = asObject(target);
68
+ for (const [key, value] of Object.entries(patch)) {
69
+ result[key] = value && typeof value === 'object' && !Array.isArray(value)
70
+ ? deepMerge(result[key], value)
71
+ : clone(value);
72
+ }
73
+ return result;
74
+ }
75
+ function childArrays(node) {
76
+ const data = asObject(node.data);
77
+ const result = [];
78
+ for (const key of ['actions', 'trueBranchActions', 'falseBranchActions']) {
79
+ if (Array.isArray(data[key]))
80
+ result.push({ key, array: data[key] });
81
+ }
82
+ if (Array.isArray(data.otherConditionBranch)) {
83
+ data.otherConditionBranch.forEach((branch, index) => {
84
+ if (Array.isArray(branch?.branchActions))
85
+ result.push({ key: `otherConditionBranch[${index}].branchActions`, array: branch.branchActions });
86
+ });
87
+ }
88
+ return result;
89
+ }
90
+ function findNode(nodes, nodeId) {
91
+ for (const raw of nodes || []) {
92
+ const node = asObject(raw);
93
+ if (String(node.id || node.wId || '') === nodeId)
94
+ return node;
95
+ for (const child of childArrays(node)) {
96
+ const found = findNode(child.array, nodeId);
97
+ if (found)
98
+ return found;
99
+ }
100
+ }
101
+ return undefined;
102
+ }
103
+ function findNodeContainer(nodes, nodeId) {
104
+ for (let index = 0; index < (nodes || []).length; index += 1) {
105
+ const node = asObject(nodes[index]);
106
+ if (String(node.id || node.wId || '') === nodeId)
107
+ return { array: nodes, index, node };
108
+ for (const child of childArrays(node)) {
109
+ const found = findNodeContainer(child.array, nodeId);
110
+ if (found)
111
+ return found;
112
+ }
113
+ }
114
+ return undefined;
115
+ }
116
+ function collectNodeIds(node, out = []) {
117
+ const id = String(node.id || node.wId || '');
118
+ if (id)
119
+ out.push(id);
120
+ for (const child of childArrays(node)) {
121
+ for (const item of child.array)
122
+ collectNodeIds(asObject(item), out);
123
+ }
124
+ return out;
125
+ }
126
+ /** 保持设计器画布骨架与动作树同步;平台保存时会校验两者不能出现悬空节点。 */
127
+ function syncAssistLayer(design, deletedNodeIds) {
128
+ if (typeof design.assistLayer !== 'string')
129
+ return;
130
+ let layer;
131
+ try {
132
+ layer = asObject(JSON.parse(design.assistLayer));
133
+ }
134
+ catch {
135
+ return;
136
+ }
137
+ if (!Array.isArray(layer.nodes))
138
+ return;
139
+ const deleted = new Set(deletedNodeIds);
140
+ const actionNodes = Array.isArray(design.actions) ? design.actions.map(asObject) : [];
141
+ const liveNodes = allNodes(design);
142
+ const eventId = String(asObject(design.event).id || asObject(design.event).wId || '');
143
+ const liveIds = new Set([eventId, ...liveNodes.map((node) => String(node.id || node.wId || '')).filter(Boolean)]);
144
+ const known = new Map();
145
+ for (const raw of layer.nodes) {
146
+ const node = asObject(raw);
147
+ const id = String(node.id || node.wId || '');
148
+ if (id && !deleted.has(id))
149
+ known.set(id, node);
150
+ }
151
+ const ordered = [];
152
+ if (eventId && known.has(eventId))
153
+ ordered.push(known.get(eventId));
154
+ actionNodes.forEach((action, index) => {
155
+ const id = String(action.id || action.wId || '');
156
+ if (!id)
157
+ return;
158
+ const existing = known.get(id);
159
+ const layout = asObject(existing?.layout);
160
+ ordered.push(existing || {
161
+ id,
162
+ type: String(action.type || ''),
163
+ layout: { x: 100, y: 220 + index * 130, width: 200, height: 80 },
164
+ });
165
+ // 仅给新增且缺少画布坐标的节点补坐标;既有节点布局不被更新器重排。
166
+ if (!existing)
167
+ ordered[ordered.length - 1].layout = { x: 100, y: 220 + index * 130, width: 200, height: 80 };
168
+ else if (!Object.keys(layout).length)
169
+ ordered[ordered.length - 1].layout = { x: 100, y: 220 + index * 130, width: 200, height: 80 };
170
+ });
171
+ // 分支/循环节点也必须保留在画布骨架中;版本保存可能重分配节点 ID,
172
+ // 因此只保留当前动作树中的节点,不能把上一版本的悬空节点带入新版。
173
+ const used = new Set(ordered.map((node) => String(node.id || node.wId || '')));
174
+ liveNodes.slice(actionNodes.length).forEach((action, index) => {
175
+ const id = String(action.id || action.wId || '');
176
+ if (!id || used.has(id))
177
+ return;
178
+ const existing = known.get(id);
179
+ ordered.push(existing || {
180
+ id,
181
+ type: String(action.type || ''),
182
+ layout: { x: 100, y: 220 + (actionNodes.length + index) * 130, width: 200, height: 80 },
183
+ });
184
+ used.add(id);
185
+ });
186
+ for (const node of layer.nodes) {
187
+ const id = String(asObject(node).id || asObject(node).wId || '');
188
+ if (id && liveIds.has(id) && !deleted.has(id) && !used.has(id))
189
+ ordered.push(asObject(node));
190
+ }
191
+ layer.nodes = ordered;
192
+ design.assistLayer = JSON.stringify(layer);
193
+ }
194
+ /** getDesignBySceneId 会展开 EventButton 的展示字段;saveDesign 只接受创建时的写入 DTO。 */
195
+ function normalizeEventForSave(event, appId = '') {
196
+ const source = asObject(event);
197
+ if (String(source.type || '') !== 'EventButton')
198
+ return clone(source);
199
+ const raw = asObject(source.data);
200
+ const targetForm = asObject(raw.targetForm);
201
+ const data = {
202
+ type: 'EventButton',
203
+ // 新建动作流使用 -1;已有动作流必须保留平台已分配的按钮组件 ID,不能把更新误当成新建。
204
+ eventButtonId: raw.eventButtonId || '-1',
205
+ sourceType: raw.sourceType || 'FORM',
206
+ triggerType: raw.triggerType || 'sequence',
207
+ targetForm: clone(targetForm),
208
+ tableType: Array.isArray(raw.tableType) ? clone(raw.tableType) : [],
209
+ appType: Array.isArray(raw.appType) ? clone(raw.appType) : [],
210
+ dataSource: { ...clone(asObject(raw.dataSource)), text: asObject(raw.dataSource).text || targetForm.text || '' },
211
+ appId: raw.appId || '',
212
+ objId: raw.objId || '',
213
+ currentApplication: raw.currentApplication || source.applicationId || appId,
214
+ applicationId: raw.applicationId || source.applicationId || appId,
215
+ buttonType: Array.isArray(raw.buttonType) ? raw.buttonType.map((button) => {
216
+ const item = asObject(button);
217
+ return {
218
+ id: item.id,
219
+ // 回读名称可能追加“(编辑保存)”等展示后缀,写入 DTO 使用按钮真实名称。
220
+ name: String(item.name || '').replace(/\([^)]*\)$/, ''),
221
+ buttonLocation: item.buttonLocation,
222
+ asyncExecution: item.asyncExecution ?? false,
223
+ };
224
+ }) : [],
225
+ };
226
+ return {
227
+ id: source.id,
228
+ wId: source.wId || source.id,
229
+ name: source.name || '按钮触发',
230
+ nameMultilang: source.nameMultilang || source.name || '按钮触发',
231
+ type: 'EventButton',
232
+ attr: clone(asObject(source.attr)),
233
+ data,
234
+ parentId: '0',
235
+ triggerType: 'WorkflowTrigger',
236
+ triggerTypeName: 'EventButton',
237
+ costTime: 0,
238
+ };
239
+ }
240
+ function flattenComponentOptions(value, out = {}) {
241
+ if (Array.isArray(value)) {
242
+ value.forEach((item) => flattenComponentOptions(item, out));
243
+ return out;
244
+ }
245
+ if (!value || typeof value !== 'object')
246
+ return out;
247
+ if (value.type && value.id && (value.actionName || value.eventName || value.componentName))
248
+ out[String(value.type)] ??= value;
249
+ Object.values(value).forEach((child) => flattenComponentOptions(child, out));
250
+ return out;
251
+ }
252
+ /** 新增节点若来自简化描述,补齐设计器“添加组件”时写入的原生目录壳。 */
253
+ function applyComponentShell(node, option) {
254
+ node.nodeType = node.nodeType || 'Normal';
255
+ node.comType = node.comType || node.type;
256
+ node.isAdd ??= true;
257
+ node.isLock ??= false;
258
+ node.ignoreFlowCheck ??= true;
259
+ node.originId = String(node.originId || option.id || '');
260
+ node.options ??= clone(option);
261
+ node.componentDesc ??= String(option.des || option.componentDesc || node.name || '');
262
+ node.componentDescLabel ??= option.componentDescLabel;
263
+ node.componentName ??= String(option.eventName || option.actionName || option.componentName || node.name || node.type || '');
264
+ node.componentNameLabel ??= option.componentNameLabel;
265
+ node.nameMultilang ??= node.name;
266
+ node.attr = { ...asObject(node.attr), ...(option.icon ? { icon: option.icon } : {}) };
267
+ }
268
+ const ACTION_WRITE_KEYS = [
269
+ 'id', 'wId', 'name', 'nameMultilang', 'type', 'typeName', 'attr', 'data', 'parentId', 'sources',
270
+ 'nodeType', 'comType', 'previousId', 'isAdd', 'isLock', 'ignoreFlowCheck', 'originId', 'options',
271
+ 'componentDesc', 'componentDescLabel', 'componentName', 'componentNameLabel',
272
+ ];
273
+ /**
274
+ * getDesignBySceneId 返回的是设计器回读模型,节点上还夹带了列表展示和编辑态字段。
275
+ * saveDesign 接收的是设计器写入模型;尤其是已有节点也必须带上设计器目录壳和链路字段。
276
+ * 这里只做模型边界转换,不改变节点 ID 或业务属性。
277
+ */
278
+ function normalizeActionForSave(node, parentId, previousId, appId, option) {
279
+ const result = {};
280
+ for (const key of ACTION_WRITE_KEYS)
281
+ if (key in node)
282
+ result[key] = clone(node[key]);
283
+ result.id = String(node.id || node.wId || '');
284
+ result.wId = String(node.wId || node.id || result.id);
285
+ result.name = node.name || node.componentName || node.type || '';
286
+ result.nameMultilang = node.nameMultilang || result.name;
287
+ result.type = node.type;
288
+ result.typeName = node.typeName || node.componentName || result.name;
289
+ result.attr = asObject(result.attr);
290
+ result.data = asObject(result.data);
291
+ result.parentId = node.parentId || parentId || '0';
292
+ if (previousId)
293
+ result.previousId = previousId;
294
+ if (option && (!node.originId || !node.options))
295
+ applyComponentShell(result, option);
296
+ // These are generated defaults in the designer's write model, not readback-only metadata.
297
+ result.data.currentApplication ??= appId;
298
+ result.data.applicationId ??= appId;
299
+ if (node.type === 'EnquiryForm') {
300
+ const source = asObject(result.data.dataSource);
301
+ const target = asObject(source);
302
+ // 查询组件的回读会附带 enquiryId/operatorId 等运行时实例字段;保存时使用
303
+ // 设计器的 LOGIC 数据源 DTO,避免把一次回读实例当成新的运行时对象提交。
304
+ result.data.dataSource = {
305
+ sourceId: target.sourceId || target.id || '',
306
+ isPhysical: target.isPhysical ?? target.physical ?? true,
307
+ peratorId: '',
308
+ authorityFlag: target.authorityFlag ?? result.data.authorityFlag ?? '0',
309
+ groupId: target.groupId || 'weaver-ebuilder-form-service',
310
+ opType: target.opType || result.data.opType || 'list',
311
+ type: target.type || 'LOGIC',
312
+ id: target.id || target.sourceId || '',
313
+ enquiryId: '-1',
314
+ text: String(target.text || '').replace(/\([^)]*\)$/, ''),
315
+ usage: '',
316
+ objType: '',
317
+ module: '',
318
+ appId: target.appId || appId,
319
+ enableFlag: '3',
320
+ ebuilderDataConfig: target.ebuilderDataConfig || {
321
+ dataSetup: { dataSource: 'ALL', dataPermission: 'HAVE_PERMISSION_DATA' },
322
+ type: 'LOGIC',
323
+ },
324
+ opText: target.opText || JSON.stringify(asObject(result.data.filterInput)),
325
+ };
326
+ const person = asObject(result.data.person);
327
+ if (Object.keys(person).length) {
328
+ result.data.person = {
329
+ formulaType: person.formulaType || 'string',
330
+ name: person.name || '{userid}',
331
+ type: person.type || '9',
332
+ value: person.value || '{userid}',
333
+ childs: Array.isArray(person.childs) ? person.childs : [],
334
+ config: person.config || { paramType: 'string', formulaVersion: 'V1' },
335
+ };
336
+ }
337
+ delete result.data.versionNum;
338
+ }
339
+ if (node.type === 'Output') {
340
+ result.data = {
341
+ outputStatus: result.data.outputStatus ?? '1',
342
+ reminder: result.data.reminder ?? '0',
343
+ triggerFlag: result.data.triggerFlag ?? false,
344
+ pageAction: result.data.pageAction ?? '0',
345
+ nextAction: result.data.nextAction ?? false,
346
+ fixedData: Array.isArray(result.data.fixedData) ? result.data.fixedData : [],
347
+ reminderMsgFormula: result.data.reminderMsgFormula ?? '',
348
+ customOutputData: result.data.customOutputData ?? '',
349
+ currentApplication: appId,
350
+ applicationId: appId,
351
+ };
352
+ }
353
+ return result;
354
+ }
355
+ function normalizeActionTreeForSave(design, appId, options) {
356
+ const eventId = String(asObject(design.event).id || asObject(design.event).wId || '');
357
+ const walk = (nodes, parentId, firstPreviousId) => {
358
+ let previousId = firstPreviousId;
359
+ for (let index = 0; index < (nodes || []).length; index += 1) {
360
+ const raw = asObject(nodes[index]);
361
+ const id = String(raw.id || raw.wId || '');
362
+ const normalized = normalizeActionForSave(raw, parentId, previousId, appId, options[String(raw.type || '')]);
363
+ nodes[index] = normalized;
364
+ previousId = id || previousId;
365
+ for (const child of childArrays(normalized))
366
+ walk(child.array, id || parentId, id || parentId);
367
+ }
368
+ };
369
+ if (Array.isArray(design.actions))
370
+ walk(design.actions, '0', eventId);
371
+ }
372
+ async function hydrateAddedComponentShells(client, operations) {
373
+ const pending = operations.filter((operation) => operation.op === 'add-node' && !operation.node.originId && !operation.node.options);
374
+ if (!pending.length)
375
+ return;
376
+ const response = await getComponentsForDesign(client);
377
+ const options = flattenComponentOptions(response?.data ?? response);
378
+ for (const operation of pending) {
379
+ const option = options[String(operation.node.type)];
380
+ if (!option)
381
+ throw new Error(`当前租户设计器目录未返回新增组件: ${operation.node.type}`);
382
+ applyComponentShell(operation.node, option);
383
+ }
384
+ }
385
+ async function normalizeExistingComponentShells(client, design) {
386
+ const nodes = allNodes(design);
387
+ const missing = nodes.some((node) => !node.originId || !node.options);
388
+ let options = {};
389
+ if (missing) {
390
+ const response = await getComponentsForDesign(client);
391
+ options = flattenComponentOptions(response?.data ?? response);
392
+ }
393
+ normalizeActionTreeForSave(design, String(design.appId || ''), options);
394
+ }
395
+ function allNodes(design) {
396
+ const result = [];
397
+ const walk = (nodes) => {
398
+ for (const raw of nodes || []) {
399
+ const node = asObject(raw);
400
+ result.push(node);
401
+ for (const child of childArrays(node))
402
+ walk(child.array);
403
+ }
404
+ };
405
+ walk(Array.isArray(design.actions) ? design.actions : []);
406
+ return result;
407
+ }
408
+ function nodeEntries(design) {
409
+ const result = [];
410
+ const walk = (nodes, basePath) => {
411
+ for (let index = 0; index < (nodes || []).length; index += 1) {
412
+ const node = asObject(nodes[index]);
413
+ const path = `${basePath}/${index}`;
414
+ result.push({ node, path, id: String(node.id || node.wId || '') });
415
+ for (const child of childArrays(node))
416
+ walk(child.array, `${path}/data/${child.key}`);
417
+ }
418
+ };
419
+ walk(Array.isArray(design.actions) ? design.actions : [], '/actions');
420
+ return result;
421
+ }
422
+ function validateOperation(operation, index) {
423
+ if (!operation || typeof operation !== 'object' || typeof operation.op !== 'string')
424
+ throw new Error(`operations[${index}] 缺少 op`);
425
+ if (operation.op === 'edit-node') {
426
+ if (!operation.nodeId || !operation.patch || typeof operation.patch !== 'object' || Array.isArray(operation.patch))
427
+ throw new Error(`operations[${index}] edit-node 必须提供 nodeId 和对象 patch`);
428
+ if ('id' in operation.patch || 'wId' in operation.patch)
429
+ throw new Error(`operations[${index}] 不允许修改节点 id/wId;已有节点必须保留原 ID`);
430
+ return;
431
+ }
432
+ if (operation.op === 'delete-node') {
433
+ if (!operation.nodeId)
434
+ throw new Error(`operations[${index}] delete-node 缺少 nodeId`);
435
+ return;
436
+ }
437
+ if (operation.op === 'add-node') {
438
+ if (typeof operation.parentPath !== 'string' || !operation.parentPath.startsWith('/actions'))
439
+ throw new Error(`operations[${index}] add-node.parentPath 必须指向 /actions 下的数组`);
440
+ if (!operation.node || typeof operation.node !== 'object' || Array.isArray(operation.node) || !operation.node.type)
441
+ throw new Error(`operations[${index}] add-node.node 必须是包含 type 的平台节点对象`);
442
+ if (operation.index !== undefined && (!Number.isInteger(operation.index) || operation.index < 0))
443
+ throw new Error(`operations[${index}] add-node.index 必须是非负整数`);
444
+ return;
445
+ }
446
+ if (operation.op === 'replace' || operation.op === 'remove') {
447
+ if (typeof operation.path !== 'string' || !operation.path.startsWith('/'))
448
+ throw new Error(`operations[${index}] ${operation.op} 缺少合法 path`);
449
+ if (operation.path === '/event' || operation.path.startsWith('/event/')) {
450
+ throw new Error(`operations[${index}] 不能修改动作流触发器 event;触发器必须保持不变。如需变更触发器,请新建动作流`);
451
+ }
452
+ if (operation.path === '/appId' || operation.path === '/sceneId' || operation.path === '/version' || operation.path === '/secretKey')
453
+ throw new Error(`operations[${index}] 不允许修改平台版本锁字段`);
454
+ if (/(^|\/)(id|wId)$/.test(operation.path))
455
+ throw new Error(`operations[${index}] 不允许通过 path 修改 ID;已有节点必须保留原 ID`);
456
+ return;
457
+ }
458
+ throw new Error(`operations[${index}] 不支持的操作: ${operation.op}`);
459
+ }
460
+ function applyOperations(design, operations) {
461
+ const next = clone(design);
462
+ const addedNodeIds = [];
463
+ const deletedNodeIds = [];
464
+ const deletedSet = new Set();
465
+ const existingIds = new Set(allNodes(next).map((node) => String(node.id || node.wId || '')).filter(Boolean));
466
+ operations.forEach((operation, index) => {
467
+ if (operation.op === 'edit-node') {
468
+ const node = findNode(Array.isArray(next.actions) ? next.actions : [], String(operation.nodeId));
469
+ if (!node)
470
+ throw new Error(`operations[${index}] 找不到节点 ${operation.nodeId}`);
471
+ const merged = deepMerge(node, operation.patch);
472
+ Object.assign(node, merged, { id: node.id, wId: node.wId });
473
+ return;
474
+ }
475
+ if (operation.op === 'delete-node') {
476
+ if (deletedSet.has(String(operation.nodeId)))
477
+ throw new Error(`operations[${index}] 节点 ${operation.nodeId} 已被删除`);
478
+ const container = findNodeContainer(Array.isArray(next.actions) ? next.actions : [], String(operation.nodeId));
479
+ if (!container)
480
+ throw new Error(`operations[${index}] 找不到节点 ${operation.nodeId}`);
481
+ const ids = collectNodeIds(container.node);
482
+ container.array.splice(container.index, 1);
483
+ ids.forEach((id) => { deletedSet.add(id); deletedNodeIds.push(id); });
484
+ return;
485
+ }
486
+ if (operation.op === 'add-node') {
487
+ const array = pointerGet(next, operation.parentPath);
488
+ if (!Array.isArray(array))
489
+ throw new Error(`operations[${index}] add-node.parentPath 不是数组: ${operation.parentPath}`);
490
+ const node = clone(operation.node);
491
+ const nodeId = String(node.id || node.wId || genSfId());
492
+ const candidateIds = collectNodeIds(node);
493
+ if (candidateIds.some((id) => existingIds.has(id) || addedNodeIds.includes(id))) {
494
+ const conflict = candidateIds.find((id) => existingIds.has(id) || addedNodeIds.includes(id));
495
+ throw new Error(`operations[${index}] 新节点或其子节点 ID 已存在: ${conflict}`);
496
+ }
497
+ node.id = nodeId;
498
+ node.wId ??= nodeId;
499
+ node.data ??= {};
500
+ const insertionIndex = operation.index === undefined ? array.length : Math.min(operation.index, array.length);
501
+ array.splice(insertionIndex, 0, node);
502
+ collectNodeIds(node).forEach((id) => { if (!addedNodeIds.includes(id))
503
+ addedNodeIds.push(id); });
504
+ return;
505
+ }
506
+ const { parent, key } = pointerParent(next, operation.path);
507
+ if (operation.op === 'replace') {
508
+ if (Array.isArray(parent) && key === '-')
509
+ parent.push(clone(operation.value));
510
+ else if (Array.isArray(parent))
511
+ parent[Number(key)] = clone(operation.value);
512
+ else
513
+ parent[key] = clone(operation.value);
514
+ }
515
+ else if (Array.isArray(parent)) {
516
+ parent.splice(Number(key), 1);
517
+ }
518
+ else {
519
+ delete parent[key];
520
+ }
521
+ });
522
+ next.deleteActions = [...new Set([...(Array.isArray(next.deleteActions) ? next.deleteActions : []), ...deletedNodeIds])];
523
+ next.addIds = [...new Set([...(Array.isArray(next.addIds) ? next.addIds : []), ...addedNodeIds])];
524
+ return { design: next, addedNodeIds, deletedNodeIds };
525
+ }
526
+ function containsPatch(actual, expected, path = '') {
527
+ if (Array.isArray(expected)) {
528
+ if (!Array.isArray(actual) || actual.length !== expected.length)
529
+ return false;
530
+ return expected.every((value, index) => containsPatch(actual[index], value, `${path}/${index}`));
531
+ }
532
+ if (expected && typeof expected === 'object' && !Array.isArray(expected)) {
533
+ if (!actual || typeof actual !== 'object' || Array.isArray(actual))
534
+ return false;
535
+ return Object.entries(expected).every(([key, value]) => {
536
+ // source.id 由平台在保存/回读时动态重分配,wId 才是稳定的节点关联键。
537
+ if (key === 'id' && path.split('/').includes('sources'))
538
+ return true;
539
+ return containsPatch(actual[key], value, `${path}/${key}`);
540
+ });
541
+ }
542
+ return JSON.stringify(actual) === JSON.stringify(expected);
543
+ }
544
+ function verifyUpdateReadback(sent, read, operations, deletedNodeIds, addedNodeIds) {
545
+ const issues = [];
546
+ const sentEntries = nodeEntries(sent);
547
+ const readEntries = nodeEntries(read);
548
+ const readById = new Map(readEntries.map((entry) => [entry.id, entry]));
549
+ const usedReadEntries = new Set();
550
+ const matched = new Map();
551
+ // 新版本保存时平台可能重分配动作节点 ID。先按 ID 校验;ID 不一致时按
552
+ // 动作树路径和类型定位,避免把平台正常的版本复制误报成内容丢失。
553
+ const matchReadEntry = (sentEntry) => {
554
+ const byId = sentEntry.id ? readById.get(sentEntry.id) : undefined;
555
+ if (byId && !usedReadEntries.has(byId))
556
+ return byId;
557
+ const byPath = readEntries.find((entry) => !usedReadEntries.has(entry)
558
+ && entry.path === sentEntry.path && String(entry.node.type || '') === String(sentEntry.node.type || ''));
559
+ if (byPath)
560
+ return byPath;
561
+ const sameTypeAndName = readEntries.filter((entry) => !usedReadEntries.has(entry)
562
+ && String(entry.node.type || '') === String(sentEntry.node.type || '')
563
+ && String(entry.node.name || '') === String(sentEntry.node.name || ''));
564
+ return sameTypeAndName.length === 1 ? sameTypeAndName[0] : undefined;
565
+ };
566
+ for (const entry of sentEntries) {
567
+ const actual = matchReadEntry(entry);
568
+ if (actual) {
569
+ usedReadEntries.add(actual);
570
+ matched.set(entry.id || entry.path, actual);
571
+ }
572
+ else if (addedNodeIds.includes(entry.id)) {
573
+ issues.push(`新增节点 ${entry.id} 未出现在回读设计`);
574
+ }
575
+ else {
576
+ issues.push(`未修改节点在回读中缺失: ${entry.id || entry.path}`);
577
+ }
578
+ }
579
+ for (const id of deletedNodeIds)
580
+ if (readById.has(id))
581
+ issues.push(`删除节点 ${id} 仍存在于回读设计`);
582
+ if (sentEntries.length !== readEntries.length) {
583
+ issues.push(`回读节点数量不一致: 期望 ${sentEntries.length},实际 ${readEntries.length}`);
584
+ }
585
+ for (const operation of operations) {
586
+ if (operation.op === 'edit-node') {
587
+ const sentEntry = sentEntries.find((entry) => entry.id === String(operation.nodeId));
588
+ const actual = sentEntry ? matched.get(sentEntry.id || sentEntry.path) : undefined;
589
+ if (!actual)
590
+ issues.push(`编辑节点 ${operation.nodeId} 未出现在回读设计`);
591
+ else if (!containsPatch(actual.node, operation.patch))
592
+ issues.push(`编辑节点 ${operation.nodeId} 的修改内容未完整回读`);
593
+ }
594
+ if ((operation.op === 'replace' || operation.op === 'remove') && operation.path.startsWith('/actions')) {
595
+ if (operation.op === 'replace') {
596
+ try {
597
+ if (!containsPatch(pointerGet(read, operation.path), operation.value))
598
+ issues.push(`路径 ${operation.path} 的修改内容未回读`);
599
+ }
600
+ catch {
601
+ issues.push(`路径 ${operation.path} 在回读中不存在`);
602
+ }
603
+ }
604
+ if (operation.op === 'remove') {
605
+ try {
606
+ pointerGet(read, operation.path);
607
+ issues.push(`路径 ${operation.path} 删除后仍存在`);
608
+ }
609
+ catch { /* expected */ }
610
+ }
611
+ }
612
+ }
613
+ const sentIds = sentEntries.map((entry) => entry.id).filter(Boolean);
614
+ return { ok: issues.length === 0, issues, nodeCount: { sent: sentEntries.length, back: readEntries.length }, deletedNodeIds, addedNodeIds };
615
+ }
616
+ function backupDesign(raw, appId, requestedPath) {
617
+ const path = resolve(requestedPath || `.actionflow-plans/backups/actionflow-${appId}-${Date.now()}.json`);
618
+ mkdirSync(dirname(path), { recursive: true });
619
+ writeFileSync(path, JSON.stringify(raw, null, 2), 'utf-8');
620
+ return path;
621
+ }
622
+ export async function runUpdate(payload, client) {
623
+ const appId = String(payload.appId || '').trim();
624
+ if (!appId)
625
+ return { valid: false, errors: ['必须提供精确的 appId;修改已有动作流不按名称匹配'], message: '修改参数不完整' };
626
+ if (!Array.isArray(payload.operations) || payload.operations.length === 0)
627
+ return { valid: false, errors: ['必须提供非空 operations 数组;未声明的节点和属性保持不变'], message: '修改参数不完整' };
628
+ try {
629
+ payload.operations.forEach(validateOperation);
630
+ }
631
+ catch (error) {
632
+ return { valid: false, errors: [String(error?.message || error)], message: '修改操作格式错误' };
633
+ }
634
+ const operations = clone(payload.operations);
635
+ let app;
636
+ let versions;
637
+ try {
638
+ app = await getApplication(client, appId);
639
+ if (app?.code !== 200 || app?.status === false || !app?.data)
640
+ return { valid: false, errors: [app?.msg || `动作流 ${appId} 不存在`], message: '目标动作流读取失败' };
641
+ versions = await getVersionList(client, appId);
642
+ }
643
+ catch (error) {
644
+ return { valid: false, errors: [String(error?.message || error)], message: '目标动作流读取失败' };
645
+ }
646
+ let sceneId = String(payload.sceneId || versions?.data?.activeVersion || app.data.activeVersion || '').trim();
647
+ if (!sceneId)
648
+ return { valid: false, errors: ['目标动作流没有可用的 activeVersion/sceneId'], message: '目标动作流读取失败' };
649
+ let raw;
650
+ try {
651
+ raw = await getDesign(client, sceneId);
652
+ }
653
+ catch (error) {
654
+ return { valid: false, appId, sceneId, errors: [String(error?.message || error)], message: '正式设计读取失败' };
655
+ }
656
+ if (raw?.code !== 200 || raw?.status === false || !raw?.data || typeof raw.data !== 'object') {
657
+ return { valid: false, appId, sceneId, errors: [raw?.msg || '正式设计响应中没有可修改的 data'], message: '正式设计读取失败' };
658
+ }
659
+ let backupFile = '';
660
+ try {
661
+ backupFile = backupDesign(raw, appId, payload.backupFile);
662
+ }
663
+ catch (error) {
664
+ return { valid: false, appId, sceneId, errors: [`修改前备份失败: ${String(error?.message || error)}`], message: '已停止修改,未调用保存接口' };
665
+ }
666
+ try {
667
+ await hydrateAddedComponentShells(client, operations);
668
+ }
669
+ catch (error) {
670
+ return { valid: false, appId, sceneId, backupFile, errors: [`新增组件目录壳准备失败: ${String(error?.message || error)}`], message: '新增组件未取得当前租户原生目录,未调用保存接口' };
671
+ }
672
+ let next;
673
+ try {
674
+ next = applyOperations(asObject(raw.data), operations);
675
+ }
676
+ catch (error) {
677
+ return { valid: false, appId, sceneId, backupFile, errors: [String(error?.message || error)], message: '修改操作执行失败,未调用保存接口' };
678
+ }
679
+ // 防御性校验:即使以后增加新的操作类型,也不能通过更新链路改掉触发器。
680
+ if (JSON.stringify(next.design.event ?? null) !== JSON.stringify(raw.data.event ?? null)) {
681
+ return {
682
+ valid: false, appId, sceneId, backupFile,
683
+ errors: ['更新计划试图修改动作流触发器 event;触发器必须保持不变。如需变更触发器,请新建动作流'],
684
+ message: '触发器不可在已有动作流上修改,未调用保存接口',
685
+ };
686
+ }
687
+ const constraintError = validateActionflowComponentConstraints(next.design);
688
+ if (constraintError) {
689
+ return { valid: false, appId, sceneId, backupFile, errors: [constraintError], message: '修改后的动作流组件组合校验未通过,未调用保存接口' };
690
+ }
691
+ next.design.appId = appId;
692
+ next.design.sceneId = sceneId;
693
+ next.design.event = normalizeEventForSave(next.design.event, appId);
694
+ next.design.secretKey = String(raw.data.secretKey || versions?.data?.actionFlowVersions?.[0]?.secretKey || '');
695
+ next.design.version = Number(raw.data.version || 1);
696
+ syncAssistLayer(next.design, next.deletedNodeIds);
697
+ try {
698
+ await normalizeExistingComponentShells(client, next.design);
699
+ }
700
+ catch (error) {
701
+ return { valid: false, appId, sceneId, backupFile, errors: [`既有节点保存模型转换失败: ${String(error?.message || error)}`], message: '未取得当前租户组件目录,未调用保存接口' };
702
+ }
703
+ const inferredEnabledState = currentEnabledState(app.data.status);
704
+ if (typeof payload.saveAndStart !== 'boolean' && inferredEnabledState === undefined) {
705
+ return { valid: false, appId, sceneId, backupFile, errors: [`无法识别目标动作流启用状态: ${String(app.data.status ?? '(empty)')};为避免误启用或误停用,请显式传 saveAndStart`], message: '启用状态无法安全继承,未调用保存接口' };
706
+ }
707
+ const saveAndStart = typeof payload.saveAndStart === 'boolean' ? payload.saveAndStart : inferredEnabledState;
708
+ try {
709
+ const checked = await checkDesign(client, next.design);
710
+ if (checked?.code !== 200 || checked?.status === false)
711
+ return { valid: false, appId, sceneId, backupFile, errors: [`check预检失败: ${checked?.msg || checked?.code || '未知错误'}`], message: '修改预检未通过,未调用保存接口' };
712
+ // 已有动作流更新必须创建平台新版本,不能覆盖当前正式版本。
713
+ const saved = await saveDesign(client, next.design, saveAndStart, true);
714
+ if (saved?.code !== 200 || saved?.status === false)
715
+ return { valid: false, saved: false, appId, sceneId, backupFile, saveAndStart, errors: [`保存已有动作流失败: ${saved?.msg || saved?.code || '未知错误'}`], message: '保存失败,原动作流未被自动覆盖' };
716
+ let returnedSceneId = String(saved?.data?.sceneId || saved?.data?.versionId || '').trim();
717
+ if (!returnedSceneId || returnedSceneId === sceneId) {
718
+ // saveDesign 在部分租户只返回成功状态,不返回新版本 ID。保存新版后
719
+ // 必须重新查版本列表,不能拿旧 sceneId 回读并误报“新版校验通过”。
720
+ const refreshedVersions = await getVersionList(client, appId);
721
+ returnedSceneId = findNewVersionId(refreshedVersions, sceneId, Number(raw.data.version || 1));
722
+ }
723
+ if (!returnedSceneId) {
724
+ return {
725
+ valid: false, saved: true, appId, sceneId, backupFile, saveAndStart,
726
+ errors: ['已调用保存新版,但未能从保存响应或版本列表定位新版本 ID;未用旧版本冒充回读'],
727
+ message: '新版已保存,但无法安全定位新版进行回读校验',
728
+ };
729
+ }
730
+ sceneId = returnedSceneId;
731
+ next.design.sceneId = returnedSceneId;
732
+ }
733
+ catch (error) {
734
+ return { valid: false, saved: false, appId, sceneId, backupFile, saveAndStart, errors: [String(error?.message || error)], message: '保存已有动作流异常,未执行自动回滚' };
735
+ }
736
+ let readBackRaw;
737
+ let readBack = null;
738
+ let lastError = '';
739
+ for (let attempt = 1; attempt <= 2; attempt += 1) {
740
+ try {
741
+ readBackRaw = await getDesign(client, sceneId);
742
+ if (readBackRaw?.code !== 200 || readBackRaw?.status === false) {
743
+ lastError = readBackRaw?.msg || `getDesignBySceneId code=${readBackRaw?.code}`;
744
+ continue;
745
+ }
746
+ readBack = verifyUpdateReadback(next.design, asObject(readBackRaw.data), operations, next.deletedNodeIds, next.addedNodeIds);
747
+ readBack.attempts = attempt;
748
+ break;
749
+ }
750
+ catch (error) {
751
+ lastError = String(error?.message || error);
752
+ }
753
+ }
754
+ if (!readBack)
755
+ return { valid: false, saved: true, appId, sceneId, backupFile, saveAndStart, errors: [`保存后回读失败: ${lastError || '未返回正式设计'}`], message: '保存已调用,但回读失败;已停止,不自动回滚' };
756
+ if (readBack.ok !== true)
757
+ return { valid: false, saved: true, appId, sceneId, backupFile, saveAndStart, readBack, errors: readBack.issues || ['保存后回读校验失败'], message: '保存已写入,但回读校验未通过;已停止,不自动回滚' };
758
+ return {
759
+ valid: true, saved: true, appId, sceneId,
760
+ workflowUrl: `${(client.auth?.getBaseUrl() || '').replace(/\/$/, '')}/sp/esb/efdesigner?application=${appId}`,
761
+ backupFile, saveAndStart, operations: operations.length,
762
+ addedNodeIds: next.addedNodeIds, deletedNodeIds: next.deletedNodeIds,
763
+ readBack, design: next.design,
764
+ message: `已有动作流修改成功,正式版本${saveAndStart ? '保持启用' : '保持未启用'},已完成回读校验`,
765
+ };
766
+ }
767
+ //# sourceMappingURL=update_service.js.map