weaver-e10-builder 1.5.12 → 1.5.14

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 (333) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +1 -0
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/designer-common.d.ts.map +1 -1
  5. package/dist/commands/designer-common.js +91 -0
  6. package/dist/commands/designer-common.js.map +1 -1
  7. package/dist/commands/designer-setters.d.ts.map +1 -1
  8. package/dist/commands/designer-setters.js +148 -47
  9. package/dist/commands/designer-setters.js.map +1 -1
  10. package/dist/commands/form-add-detail-table.d.ts.map +1 -1
  11. package/dist/commands/form-add-detail-table.js +150 -8
  12. package/dist/commands/form-add-detail-table.js.map +1 -1
  13. package/dist/commands/form-browser-definition.d.ts +14 -0
  14. package/dist/commands/form-browser-definition.d.ts.map +1 -0
  15. package/dist/commands/form-browser-definition.js +493 -0
  16. package/dist/commands/form-browser-definition.js.map +1 -0
  17. package/dist/commands/form-code.d.ts +5 -0
  18. package/dist/commands/form-code.d.ts.map +1 -0
  19. package/dist/commands/form-code.js +276 -0
  20. package/dist/commands/form-code.js.map +1 -0
  21. package/dist/commands/form-engine-linkage.d.ts +3 -0
  22. package/dist/commands/form-engine-linkage.d.ts.map +1 -0
  23. package/dist/commands/form-engine-linkage.js +199 -0
  24. package/dist/commands/form-engine-linkage.js.map +1 -0
  25. package/dist/commands/form-formula.d.ts.map +1 -1
  26. package/dist/commands/form-formula.js +11 -6
  27. package/dist/commands/form-formula.js.map +1 -1
  28. package/dist/commands/form-layout-template-advanced.d.ts +3 -0
  29. package/dist/commands/form-layout-template-advanced.d.ts.map +1 -0
  30. package/dist/commands/form-layout-template-advanced.js +115 -0
  31. package/dist/commands/form-layout-template-advanced.js.map +1 -0
  32. package/dist/commands/form-layout-template-easy.d.ts +3 -0
  33. package/dist/commands/form-layout-template-easy.d.ts.map +1 -0
  34. package/dist/commands/form-layout-template-easy.js +59 -0
  35. package/dist/commands/form-layout-template-easy.js.map +1 -0
  36. package/dist/commands/form-layout.d.ts.map +1 -1
  37. package/dist/commands/form-layout.js +77 -0
  38. package/dist/commands/form-layout.js.map +1 -1
  39. package/dist/commands/form-list-filter.js +1 -1
  40. package/dist/commands/form-list-filter.js.map +1 -1
  41. package/dist/commands/form-list-utils.d.ts +5 -0
  42. package/dist/commands/form-list-utils.d.ts.map +1 -1
  43. package/dist/commands/form-list-utils.js +23 -3
  44. package/dist/commands/form-list-utils.js.map +1 -1
  45. package/dist/commands/form-permission.d.ts.map +1 -1
  46. package/dist/commands/form-permission.js +55 -19
  47. package/dist/commands/form-permission.js.map +1 -1
  48. package/dist/commands/form-physical-table.d.ts.map +1 -1
  49. package/dist/commands/form-physical-table.js +8 -2
  50. package/dist/commands/form-physical-table.js.map +1 -1
  51. package/dist/commands/form.d.ts.map +1 -1
  52. package/dist/commands/form.js +476 -30
  53. package/dist/commands/form.js.map +1 -1
  54. package/dist/commands/menu.d.ts +68 -2
  55. package/dist/commands/menu.d.ts.map +1 -1
  56. package/dist/commands/menu.js +186 -41
  57. package/dist/commands/menu.js.map +1 -1
  58. package/dist/commands/page.d.ts.map +1 -1
  59. package/dist/commands/page.js +29 -6
  60. package/dist/commands/page.js.map +1 -1
  61. package/dist/commands/special.d.ts.map +1 -1
  62. package/dist/commands/special.js +3 -2
  63. package/dist/commands/special.js.map +1 -1
  64. package/dist/commands/wf-form.d.ts.map +1 -1
  65. package/dist/commands/wf-form.js +76 -31
  66. package/dist/commands/wf-form.js.map +1 -1
  67. package/dist/commands/workflow-auth-resp.js +2 -2
  68. package/dist/commands/workflow-auth-resp.js.map +1 -1
  69. package/dist/commands/workflow-base-settings.d.ts +3 -0
  70. package/dist/commands/workflow-base-settings.d.ts.map +1 -0
  71. package/dist/commands/workflow-base-settings.js +73 -0
  72. package/dist/commands/workflow-base-settings.js.map +1 -0
  73. package/dist/commands/workflow-condition.d.ts.map +1 -1
  74. package/dist/commands/workflow-condition.js +59 -450
  75. package/dist/commands/workflow-condition.js.map +1 -1
  76. package/dist/commands/workflow-export.d.ts +9 -0
  77. package/dist/commands/workflow-export.d.ts.map +1 -0
  78. package/dist/commands/workflow-export.js +121 -0
  79. package/dist/commands/workflow-export.js.map +1 -0
  80. package/dist/commands/workflow-node.d.ts.map +1 -1
  81. package/dist/commands/workflow-node.js +28 -53
  82. package/dist/commands/workflow-node.js.map +1 -1
  83. package/dist/commands/workflow-operator-batch.d.ts +3 -0
  84. package/dist/commands/workflow-operator-batch.d.ts.map +1 -0
  85. package/dist/commands/workflow-operator-batch.js +35 -0
  86. package/dist/commands/workflow-operator-batch.js.map +1 -0
  87. package/dist/commands/workflow-subprocess.d.ts.map +1 -1
  88. package/dist/commands/workflow-subprocess.js +21 -33
  89. package/dist/commands/workflow-subprocess.js.map +1 -1
  90. package/dist/commands/workflow.d.ts.map +1 -1
  91. package/dist/commands/workflow.js +36 -37
  92. package/dist/commands/workflow.js.map +1 -1
  93. package/dist/index.js +18 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/services/actionflow/browser_source.d.ts +9 -0
  96. package/dist/services/actionflow/browser_source.d.ts.map +1 -0
  97. package/dist/services/actionflow/browser_source.js +12 -0
  98. package/dist/services/actionflow/browser_source.js.map +1 -0
  99. package/dist/services/actionflow/components/date_trigger.js +1 -1
  100. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  101. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  102. package/dist/services/actionflow/components/document_actions.js +178 -25
  103. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  104. package/dist/services/actionflow/components/enquiry_form.js +1 -1
  105. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  106. package/dist/services/actionflow/components/logic_flow_set.d.ts.map +1 -1
  107. package/dist/services/actionflow/components/logic_flow_set.js +80 -8
  108. package/dist/services/actionflow/components/logic_flow_set.js.map +1 -1
  109. package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
  110. package/dist/services/actionflow/components/meeting_create.js +1 -0
  111. package/dist/services/actionflow/components/meeting_create.js.map +1 -1
  112. package/dist/services/actionflow/components/schedule_create.d.ts.map +1 -1
  113. package/dist/services/actionflow/components/schedule_create.js +2 -0
  114. package/dist/services/actionflow/components/schedule_create.js.map +1 -1
  115. package/dist/services/actionflow/components/time_batch_trigger.js +1 -1
  116. package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
  117. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  118. package/dist/services/actionflow/components/workflow_actions.js +6 -2
  119. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  120. package/dist/services/actionflow/context_preflight.d.ts +5 -0
  121. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  122. package/dist/services/actionflow/context_preflight.js +186 -35
  123. package/dist/services/actionflow/context_preflight.js.map +1 -1
  124. package/dist/services/actionflow/filter_rules.d.ts.map +1 -1
  125. package/dist/services/actionflow/filter_rules.js +9 -8
  126. package/dist/services/actionflow/filter_rules.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 +8 -0
  130. package/dist/services/actionflow/form_source.js.map +1 -1
  131. package/dist/services/actionflow/formula_service.d.ts +2 -1
  132. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  133. package/dist/services/actionflow/formula_service.js +69 -34
  134. package/dist/services/actionflow/formula_service.js.map +1 -1
  135. package/dist/services/actionflow/logicflow_source.d.ts +5 -0
  136. package/dist/services/actionflow/logicflow_source.d.ts.map +1 -0
  137. package/dist/services/actionflow/logicflow_source.js +15 -0
  138. package/dist/services/actionflow/logicflow_source.js.map +1 -0
  139. package/dist/services/actionflow/preflight_service.d.ts +15 -0
  140. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  141. package/dist/services/actionflow/preflight_service.js +561 -29
  142. package/dist/services/actionflow/preflight_service.js.map +1 -1
  143. package/dist/services/actionflow/runtime_metadata.d.ts +8 -0
  144. package/dist/services/actionflow/runtime_metadata.d.ts.map +1 -1
  145. package/dist/services/actionflow/runtime_metadata.js +25 -0
  146. package/dist/services/actionflow/runtime_metadata.js.map +1 -1
  147. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  148. package/dist/services/actionflow/workflow_compiler.js +75 -23
  149. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  150. package/dist/services/actionflow/workflow_source.d.ts +2 -0
  151. package/dist/services/actionflow/workflow_source.d.ts.map +1 -1
  152. package/dist/services/actionflow/workflow_source.js +7 -0
  153. package/dist/services/actionflow/workflow_source.js.map +1 -1
  154. package/dist/services/auth-resp-condition.d.ts +7 -3
  155. package/dist/services/auth-resp-condition.d.ts.map +1 -1
  156. package/dist/services/auth-resp-condition.js +58 -63
  157. package/dist/services/auth-resp-condition.js.map +1 -1
  158. package/dist/services/browser.d.ts +5 -0
  159. package/dist/services/browser.d.ts.map +1 -1
  160. package/dist/services/browser.js +16 -4
  161. package/dist/services/browser.js.map +1 -1
  162. package/dist/services/condition-rules.d.ts +2 -30
  163. package/dist/services/condition-rules.d.ts.map +1 -1
  164. package/dist/services/condition-rules.js +3 -219
  165. package/dist/services/condition-rules.js.map +1 -1
  166. package/dist/services/designer-dataset.d.ts +45 -0
  167. package/dist/services/designer-dataset.d.ts.map +1 -0
  168. package/dist/services/designer-dataset.js +156 -0
  169. package/dist/services/designer-dataset.js.map +1 -0
  170. package/dist/services/form-association.d.ts +7 -0
  171. package/dist/services/form-association.d.ts.map +1 -1
  172. package/dist/services/form-association.js +22 -1
  173. package/dist/services/form-association.js.map +1 -1
  174. package/dist/services/form-code.d.ts +53 -0
  175. package/dist/services/form-code.d.ts.map +1 -0
  176. package/dist/services/form-code.js +370 -0
  177. package/dist/services/form-code.js.map +1 -0
  178. package/dist/services/form-create.d.ts +20 -0
  179. package/dist/services/form-create.d.ts.map +1 -1
  180. package/dist/services/form-create.js +73 -1
  181. package/dist/services/form-create.js.map +1 -1
  182. package/dist/services/form-field-build.d.ts +1 -1
  183. package/dist/services/form-field-build.d.ts.map +1 -1
  184. package/dist/services/form-field-build.js +20 -1
  185. package/dist/services/form-field-build.js.map +1 -1
  186. package/dist/services/form-field-drop.d.ts +2 -0
  187. package/dist/services/form-field-drop.d.ts.map +1 -1
  188. package/dist/services/form-field-drop.js +2 -0
  189. package/dist/services/form-field-drop.js.map +1 -1
  190. package/dist/services/form-layout-detail-insert.d.ts +58 -0
  191. package/dist/services/form-layout-detail-insert.d.ts.map +1 -0
  192. package/dist/services/form-layout-detail-insert.js +293 -0
  193. package/dist/services/form-layout-detail-insert.js.map +1 -0
  194. package/dist/services/form-layout-insert.d.ts.map +1 -1
  195. package/dist/services/form-layout-insert.js +34 -2
  196. package/dist/services/form-layout-insert.js.map +1 -1
  197. package/dist/services/form-layout-source/compile.d.ts.map +1 -1
  198. package/dist/services/form-layout-source/compile.js +11 -4
  199. package/dist/services/form-layout-source/compile.js.map +1 -1
  200. package/dist/services/form-layout-template-advanced.d.ts +330 -0
  201. package/dist/services/form-layout-template-advanced.d.ts.map +1 -0
  202. package/dist/services/form-layout-template-advanced.js +1437 -0
  203. package/dist/services/form-layout-template-advanced.js.map +1 -0
  204. package/dist/services/form-layout-template-easy.d.ts +34 -0
  205. package/dist/services/form-layout-template-easy.d.ts.map +1 -0
  206. package/dist/services/form-layout-template-easy.js +159 -0
  207. package/dist/services/form-layout-template-easy.js.map +1 -0
  208. package/dist/services/form-layout-template-flow.d.ts +23 -0
  209. package/dist/services/form-layout-template-flow.d.ts.map +1 -0
  210. package/dist/services/form-layout-template-flow.js +99 -0
  211. package/dist/services/form-layout-template-flow.js.map +1 -0
  212. package/dist/services/form-linkage-condition.d.ts +15 -0
  213. package/dist/services/form-linkage-condition.d.ts.map +1 -1
  214. package/dist/services/form-linkage-condition.js +19 -10
  215. package/dist/services/form-linkage-condition.js.map +1 -1
  216. package/dist/services/form-permission-archive.d.ts +23 -1
  217. package/dist/services/form-permission-archive.d.ts.map +1 -1
  218. package/dist/services/form-permission-archive.js +54 -2
  219. package/dist/services/form-permission-archive.js.map +1 -1
  220. package/dist/services/form-physical-table.d.ts +10 -0
  221. package/dist/services/form-physical-table.d.ts.map +1 -1
  222. package/dist/services/form-physical-table.js +20 -0
  223. package/dist/services/form-physical-table.js.map +1 -1
  224. package/dist/services/form-sub-detail.d.ts +25 -0
  225. package/dist/services/form-sub-detail.d.ts.map +1 -1
  226. package/dist/services/form-sub-detail.js +64 -0
  227. package/dist/services/form-sub-detail.js.map +1 -1
  228. package/dist/services/form-view-linkage-functions.d.ts +19 -0
  229. package/dist/services/form-view-linkage-functions.d.ts.map +1 -0
  230. package/dist/services/form-view-linkage-functions.js +90 -0
  231. package/dist/services/form-view-linkage-functions.js.map +1 -0
  232. package/dist/services/matrix-condition.d.ts +32 -1
  233. package/dist/services/matrix-condition.d.ts.map +1 -1
  234. package/dist/services/matrix-condition.js +169 -6
  235. package/dist/services/matrix-condition.js.map +1 -1
  236. package/dist/services/menu-catalog.d.ts +24 -1
  237. package/dist/services/menu-catalog.d.ts.map +1 -1
  238. package/dist/services/menu-catalog.js +49 -2
  239. package/dist/services/menu-catalog.js.map +1 -1
  240. package/dist/services/workflow-base-settings.d.ts +117 -0
  241. package/dist/services/workflow-base-settings.d.ts.map +1 -0
  242. package/dist/services/workflow-base-settings.js +504 -0
  243. package/dist/services/workflow-base-settings.js.map +1 -0
  244. package/dist/services/workflow-condition-core.d.ts +48 -0
  245. package/dist/services/workflow-condition-core.d.ts.map +1 -0
  246. package/dist/services/workflow-condition-core.js +316 -0
  247. package/dist/services/workflow-condition-core.js.map +1 -0
  248. package/dist/services/workflow-context.d.ts +10 -0
  249. package/dist/services/workflow-context.d.ts.map +1 -0
  250. package/dist/services/workflow-context.js +15 -0
  251. package/dist/services/workflow-context.js.map +1 -0
  252. package/dist/services/workflow-export.d.ts +80 -0
  253. package/dist/services/workflow-export.d.ts.map +1 -0
  254. package/dist/services/workflow-export.js +150 -0
  255. package/dist/services/workflow-export.js.map +1 -0
  256. package/dist/services/workflow-field-permission-route.d.ts +75 -0
  257. package/dist/services/workflow-field-permission-route.d.ts.map +1 -0
  258. package/dist/services/workflow-field-permission-route.js +52 -0
  259. package/dist/services/workflow-field-permission-route.js.map +1 -0
  260. package/dist/services/workflow-field-permission.d.ts +18 -0
  261. package/dist/services/workflow-field-permission.d.ts.map +1 -0
  262. package/dist/services/workflow-field-permission.js +40 -0
  263. package/dist/services/workflow-field-permission.js.map +1 -0
  264. package/dist/services/workflow-node-layout.d.ts +11 -10
  265. package/dist/services/workflow-node-layout.d.ts.map +1 -1
  266. package/dist/services/workflow-node-layout.js +24 -62
  267. package/dist/services/workflow-node-layout.js.map +1 -1
  268. package/dist/services/workflow-operator-batch-condition.d.ts +23 -0
  269. package/dist/services/workflow-operator-batch-condition.d.ts.map +1 -0
  270. package/dist/services/workflow-operator-batch-condition.js +56 -0
  271. package/dist/services/workflow-operator-batch-condition.js.map +1 -0
  272. package/dist/services/workflow-operator.d.ts +12 -5
  273. package/dist/services/workflow-operator.d.ts.map +1 -1
  274. package/dist/services/workflow-operator.js +41 -16
  275. package/dist/services/workflow-operator.js.map +1 -1
  276. package/package.json +1 -1
  277. package/skill-docs/SKILL.md +155 -290
  278. package/skill-docs/_catalog.md +12 -3
  279. package/skill-docs/actionflows/references/components/document/GetDocumentInfo.md +17 -17
  280. package/skill-docs/actionflows/references/components/logic/LogicFlowSet.md +23 -17
  281. package/skill-docs/assets/form-template/style-templates-advanced-base-example.json +1420 -0
  282. package/skill-docs/assets/form-template/style-templates-advanced-base.css +33 -0
  283. package/skill-docs/assets/form-template/style-templates-advanced-blue-crystal-example.json +1094 -0
  284. package/skill-docs/assets/form-template/style-templates-advanced-document-example.json +1251 -0
  285. package/skill-docs/assets/form-template/style-templates-advanced-grid-example.json +39 -0
  286. package/skill-docs/assets/form-template/style-templates-advanced-page-example.json +38 -0
  287. package/skill-docs/assets/form-template/style-templates-advanced-placements-example.json +30 -0
  288. package/skill-docs/assets/form-template/style-templates-advanced-standard-example.json +53 -0
  289. package/skill-docs/assets/form-template/style-templates-advanced-structure-example.json +25 -0
  290. package/skill-docs/assets/form-template/style-templates-advanced-table-example.json +1420 -0
  291. package/skill-docs/references/code-block/guide-code-block.md +141 -0
  292. package/skill-docs/references/code-block/guide-layout-css.md +107 -0
  293. package/skill-docs/references/code-block/ref-controls.md +60 -0
  294. package/skill-docs/references/code-block/ref-coverage.md +32 -0
  295. package/skill-docs/references/code-block/ref-details.md +57 -0
  296. package/skill-docs/references/code-block/ref-events-validation.md +42 -0
  297. package/skill-docs/references/code-block/ref-foundations-fields.md +56 -0
  298. package/skill-docs/references/code-block/ref-recipes.md +164 -0
  299. package/skill-docs/references/code-block/ref-troubleshooting.md +49 -0
  300. package/skill-docs/references/code-block/ref-ui-global.md +47 -0
  301. package/skill-docs/references/coding/guide-page-code.md +2 -0
  302. package/skill-docs/references/coding/ref-compile-rules.md +2 -0
  303. package/skill-docs/references/common/capability-boundaries.md +15 -0
  304. package/skill-docs/references/common/guide-install.md +44 -0
  305. package/skill-docs/references/common/guide-plan-template.md +2 -1
  306. package/skill-docs/references/common/map.md +11 -1
  307. package/skill-docs/references/common/ref-cli-commands.md +689 -648
  308. package/skill-docs/references/ebuilder-designer/guide-designer-factory.md +8 -4
  309. package/skill-docs/references/form/form-template/style-templates-advanced-css-guide.md +167 -0
  310. package/skill-docs/references/form/form-template/style-templates-advanced.md +315 -0
  311. package/skill-docs/references/form/form-template/style-templates-easy.md +55 -0
  312. package/skill-docs/references/form/form-template/style-templates-flow.md +27 -0
  313. package/skill-docs/references/form/form-template/style-templates.md +29 -0
  314. package/skill-docs/references/form/guide-browser-definition.md +148 -0
  315. package/skill-docs/references/form/guide-create-form.md +258 -250
  316. package/skill-docs/references/form/guide-field-linkage.md +56 -14
  317. package/skill-docs/references/form/guide-form-archive-permission.md +29 -6
  318. package/skill-docs/references/form/guide-form-formula-functions.md +11 -0
  319. package/skill-docs/references/form/guide-form-layout-incremental.md +28 -0
  320. package/skill-docs/references/form/guide-form-layout-planning.md +11 -0
  321. package/skill-docs/references/form/guide-form-layout-source.md +4 -0
  322. package/skill-docs/references/form/guide-form-linkage.md +295 -269
  323. package/skill-docs/references/form/guide-form-physical-table.md +2 -0
  324. package/skill-docs/references/form/guide-form-view.md +3 -0
  325. package/skill-docs/references/form/ref-form-fields.md +301 -293
  326. package/skill-docs/references/form/ref-list-filter-date-params.md +83 -0
  327. package/skill-docs/references/menu/system-menus.md +12 -0
  328. package/skill-docs/references/workflow/condition-core-contract.md +63 -0
  329. package/skill-docs/references/workflow/guide-base-auth-share-remind.md +126 -0
  330. package/skill-docs/references/workflow/guide-workflow-condition.md +476 -447
  331. package/skill-docs/references/workflow/guide-workflow-node-layout.md +6 -0
  332. package/skill-docs/references/workflow/guide-workflow.md +29 -3
  333. package/skill-docs/references/form/style-templates.md +0 -97
@@ -4,17 +4,20 @@ import * as personSource from './person_source.js';
4
4
  import * as contextSource from './context_source.js';
5
5
  import * as hrmSource from './hrm_source.js';
6
6
  import * as documentSource from './document_source.js';
7
+ import * as browserSource from './browser_source.js';
8
+ import * as logicFlowSource from './logicflow_source.js';
7
9
  import { completeEbuilder, pickEbuilderBrowserRow } from './ebuilder_source.js';
8
10
  import { resolveHttpBindings } from './http_source.js';
9
- import { registerTargetFormFields, registerTargetDetailFields, registerWorkflowFieldIds, registerWorkflowContextFields, getWorkflowFieldIds, getWorkflowDetailFields, getWorkflowDetailNames, getTargetFormFields, getTargetDetailFields, } from './runtime_metadata.js';
11
+ import { registerTargetFormFields, registerTargetDetailFields, registerWorkflowFieldIds, registerWorkflowContextFields, getWorkflowFieldIds, getWorkflowDetailFields, getWorkflowDetailNames, getTargetFormFields, getTargetDetailFields, replaceTargetDataSourceFields, } from './runtime_metadata.js';
10
12
  // workflow_id → 目标表单 id(进程缓存)
11
13
  const FORM_ID_CACHE = {};
12
14
  import { ContextStore, PlatformContextProvider } from './context_provider.js';
13
- import { hydrateContextReferences, hydrateQueryResultReferences, queryNodeContext } from './context_preflight.js';
15
+ import { hydrateContextReferences, hydrateQueryResultReferences, queryNodeContext, resolveContextGroupRoot, } from './context_preflight.js';
14
16
  import { get as getComponent } from './components/index.js';
15
17
  import { defaultQueryFieldsAll } from './query_field_defaults.js';
16
18
  import { getStepBranches } from './step_branches.js';
17
19
  import { normalizeParamGroupSetting } from './param_group_dto.js';
20
+ import { genSfId } from './id_generator.js';
18
21
  // 表单字段进程缓存
19
22
  const FORM_FIELDS_CACHE = {};
20
23
  const FORM_LIST_CACHE = {};
@@ -468,16 +471,22 @@ function walkPlanSteps(value) {
468
471
  /** 把显式固定人员展开为当前租户 Browser 对象。 */
469
472
  export async function resolveFixedPeople(plan, client) {
470
473
  const records = [];
471
- for (const step of walkPlanSteps(plan.actions || [])) {
474
+ for (const step of walkPlanSteps({ event: plan.event, actions: plan.actions || [] })) {
472
475
  const componentType = String(step.type || '');
473
476
  const contract = getComponent(componentType);
474
- const personKeys = Object.entries(contract?.params || {})
477
+ const personKeys = new Set(Object.entries(contract?.params || {})
475
478
  .filter(([, definition]) => String(definition?.referenceType || '').startsWith('user_assignment'))
476
- .map(([key]) => key);
479
+ .map(([key]) => key));
480
+ for (const source of contract?.propertySources || []) {
481
+ if (source?.module === 'core.person_source' && source?.lookups?.includes('resourceData')) {
482
+ for (const key of source.properties || [])
483
+ personKeys.add(String(key));
484
+ }
485
+ }
477
486
  // 会议字段在 meetingFields 中承载,属于组件特有嵌套结构,无法从顶层 params 推导。
478
487
  if (componentType === 'MeetingCreate')
479
- personKeys.push('caller', 'contacter', 'hrmMembers');
480
- if (!personKeys.length)
488
+ ['caller', 'contacter', 'hrmMembers'].forEach((key) => personKeys.add(key));
489
+ if (!personKeys.size)
481
490
  continue;
482
491
  const params = step.params || {};
483
492
  const fields = params.meetingFields;
@@ -490,7 +499,10 @@ export async function resolveFixedPeople(plan, client) {
490
499
  const raw = container[key];
491
500
  if (raw == null)
492
501
  continue;
493
- const values = Array.isArray(raw) ? raw : [raw];
502
+ const fixedArray = raw && typeof raw === 'object' && raw.kind === 'fixed' && Array.isArray(raw.value);
503
+ const values = fixedArray ? raw.value : (Array.isArray(raw) ? raw : [raw]);
504
+ if (values.some((item) => item && typeof item === 'object' && item.type && item.config && !item.kind))
505
+ continue;
494
506
  // 动态上下文/变量/常量/函数的 id 不是人员 id,不能送进
495
507
  // resourceData 做 Browser 补全,否则会把合法动态赋值误报为人员不存在。
496
508
  const dynamicKinds = new Set(['context', 'reference', 'system_variable', 'variable', 'constant', 'function', 'formula']);
@@ -499,19 +511,30 @@ export async function resolveFixedPeople(plan, client) {
499
511
  continue;
500
512
  if (values.length && values.every((item) => isBrowserPerson(item)))
501
513
  continue;
502
- if (!values.length || !values.every((item) => item && typeof item === 'object' && item.id))
514
+ if (!values.length)
503
515
  continue;
504
516
  const resolved = [];
505
517
  for (const item of values) {
506
- const query = String(item.name || item.id);
518
+ const fixed = item && typeof item === 'object' && item.kind === 'fixed' ? item.value : item;
519
+ const id = fixed && typeof fixed === 'object' ? String(fixed.id || '').trim() : '';
520
+ const name = fixed && typeof fixed === 'object'
521
+ ? String(fixed.name || fixed.content || fixed.username || '').trim()
522
+ : String(fixed || '').trim();
523
+ if (!id && /^\d{10,}$/.test(name))
524
+ throw new Error(`${componentType}.${key} 固定人员只有 id、没有名称;人员 Browser 必须按名称查询`);
525
+ if (!name)
526
+ throw new Error(`${componentType}.${key} 固定人员只有 id、没有名称;人员 Browser 必须按名称查询后校验 id`);
527
+ const query = name;
507
528
  const response = await personSource.resourceData(client, query, 1, 30);
508
529
  const rows = response?.data?.data || [];
509
- const match = rows.find((r) => r && typeof r === 'object' && String(r.id) === String(item.id));
510
- if (!match)
511
- throw new Error(`${componentType}.${key} 的人员 id=${item.id} 不在当前租户人员浏览器中,无法生成可回显的 Browser 对象`);
512
- resolved.push(match);
530
+ const matches = rows.filter((r) => r && typeof r === 'object'
531
+ && String(r.name || r.content || r.username || '').trim() === name
532
+ && (!id || String(r.id || '').trim() === id));
533
+ if (matches.length !== 1)
534
+ throw new Error(`${componentType}.${key} 未能按名称从人员 Browser 唯一匹配 '${name}'(匹配数: ${matches.length})`);
535
+ resolved.push(matches[0]);
513
536
  }
514
- container[key] = Array.isArray(raw) ? resolved : resolved[0];
537
+ container[key] = Array.isArray(raw) || fixedArray ? resolved : resolved[0];
515
538
  records.push({
516
539
  path: `${componentType}.${containerName}.${key}`,
517
540
  resourceType: 'user_browser',
@@ -525,6 +548,227 @@ export async function resolveFixedPeople(plan, client) {
525
548
  (plan._autoResources ??= []).push(...records);
526
549
  return records;
527
550
  }
551
+ function workflowRequestRows(response) {
552
+ const data = response?.data ?? response;
553
+ for (const rows of [data?.data, data?.rows, data?.list, data?.records, data]) {
554
+ if (Array.isArray(rows))
555
+ return rows.filter((row) => row && typeof row === 'object');
556
+ }
557
+ return [];
558
+ }
559
+ function workflowRequestId(row) {
560
+ return String(row?.id ?? row?.requestId ?? row?.requestid ?? row?.value ?? '').trim();
561
+ }
562
+ function workflowRequestName(row) {
563
+ return String(row?.name ?? row?.requestName ?? row?.requestname ?? row?.title ?? row?.content ?? row?.text ?? '').trim();
564
+ }
565
+ /** 固定 requestId/flag 只接受当前租户 wfcRequest 返回的流程实例。 */
566
+ export async function resolveFixedWorkflowInstances(plan, client) {
567
+ const records = [];
568
+ const cache = new Map();
569
+ for (const step of walkPlanSteps(plan.actions || [])) {
570
+ const params = step.params;
571
+ if (!params || typeof params !== 'object')
572
+ continue;
573
+ const contract = getComponent(String(step.type || ''));
574
+ const instanceSource = (contract?.propertySources || []).find((source) => source?.module === 'core.workflow_source' && source?.lookups?.includes('workflowRequestComplete'));
575
+ if (!instanceSource)
576
+ continue;
577
+ for (const key of instanceSource.properties || []) {
578
+ const raw = params[key];
579
+ if (raw === undefined || raw === null || raw === '')
580
+ continue;
581
+ const fixedArray = raw && typeof raw === 'object' && raw.kind === 'fixed' && Array.isArray(raw.value);
582
+ const values = fixedArray ? raw.value : (Array.isArray(raw) ? raw : [raw]);
583
+ const resolved = [];
584
+ for (const value of values) {
585
+ if (isDynamicAssignment(value) || (value && typeof value === 'object' && value.type && value.config && !value.kind)) {
586
+ resolved.push(value);
587
+ continue;
588
+ }
589
+ const fixed = value && typeof value === 'object' && value.kind === 'fixed' ? value.value : value;
590
+ const id = typeof fixed === 'object' && fixed !== null ? workflowRequestId(fixed) : '';
591
+ const name = typeof fixed === 'object' && fixed !== null ? workflowRequestName(fixed) : String(fixed ?? '').trim();
592
+ if (!id && !name)
593
+ throw new Error(`${step.type}.${key} 固定值缺少流程实例 id 或 name`);
594
+ if (!id && /^\d{10,}$/.test(name))
595
+ throw new Error(`${step.type}.${key} 固定流程实例只有 id、没有名称;wfcRequest 必须按名称查询`);
596
+ if (!name)
597
+ throw new Error(`${step.type}.${key} 固定流程实例只有 id、没有名称;wfcRequest 必须按名称查询后校验 id`);
598
+ const query = name;
599
+ let rows = cache.get(query);
600
+ if (!rows) {
601
+ rows = workflowRequestRows(await workflowSource.workflowRequestComplete(client, query));
602
+ cache.set(query, rows);
603
+ }
604
+ const matches = rows.filter((row) => id ? workflowRequestId(row) === id : workflowRequestName(row) === name);
605
+ if (matches.length !== 1)
606
+ throw new Error(`${step.type}.${key} 未能从 wfcRequest 唯一匹配流程实例 '${id || name}'(匹配数: ${matches.length})`);
607
+ const browser = matches[0];
608
+ resolved.push(browser);
609
+ records.push({
610
+ path: `${step.type}.params.${key}`, resourceType: 'workflow_instance_browser',
611
+ value: { id: workflowRequestId(browser), name: workflowRequestName(browser) },
612
+ reason: '固定流程实例已通过当前租户 wfcRequest Browser 校验并补全',
613
+ });
614
+ }
615
+ params[key] = Array.isArray(raw) || fixedArray ? resolved : resolved[0];
616
+ }
617
+ }
618
+ if (records.length)
619
+ (plan._autoResources ??= []).push(...records);
620
+ return records;
621
+ }
622
+ function browserRows(response) {
623
+ const data = response?.data ?? response;
624
+ for (const rows of [data?.data, data?.rows, data?.list, data?.records, data]) {
625
+ if (Array.isArray(rows))
626
+ return rows.filter((row) => row && typeof row === 'object');
627
+ }
628
+ return [];
629
+ }
630
+ function browserId(row) {
631
+ return String(row?.id ?? row?.value ?? row?.fileid ?? row?.requestid ?? '').trim();
632
+ }
633
+ function browserNames(row) {
634
+ return [row?.name, row?.ruleName, row?.content, row?.title, row?.requestname, row?.username]
635
+ .filter((value) => value !== undefined && value !== null && String(value).trim())
636
+ .map((value) => String(value).trim());
637
+ }
638
+ function readObjectPath(value, path) {
639
+ return String(path).split('.').reduce((current, key) => current?.[key], value);
640
+ }
641
+ /** 根据组件声明的前端 Browser type/module,把固定名称补全成当前租户原对象。 */
642
+ export async function resolveNamedFixedBrowsers(plan, client) {
643
+ const records = [];
644
+ const cache = new Map();
645
+ for (const step of walkPlanSteps({ event: plan.event, actions: plan.actions || [] })) {
646
+ const params = step.params;
647
+ if (!params || typeof params !== 'object')
648
+ continue;
649
+ const contract = getComponent(String(step.type || ''));
650
+ const sources = (contract?.propertySources || []).filter((source) => source?.module === 'core.browser_source' && source?.lookups?.includes('browserComplete') && source?.browser);
651
+ for (const source of sources) {
652
+ for (const key of source.properties || []) {
653
+ const raw = params[key];
654
+ if (raw === undefined || raw === null || raw === '')
655
+ continue;
656
+ const configured = source.browser;
657
+ const fixedOnly = configured.fixedOnly === true;
658
+ const fixedArray = raw && typeof raw === 'object' && raw.kind === 'fixed' && Array.isArray(raw.value);
659
+ const values = fixedArray ? raw.value : (Array.isArray(raw) ? raw : [raw]);
660
+ const resolved = [];
661
+ for (const item of values) {
662
+ if (fixedOnly && (isDynamicAssignment(item) || (item && typeof item === 'object' && item.type && item.config && !item.kind))) {
663
+ throw new Error(`${step.type}.${key} 只支持固定 Browser 赋值,不支持动态公式或上下文引用`);
664
+ }
665
+ if (isDynamicAssignment(item) || (item && typeof item === 'object' && item.type && item.config && !item.kind)) {
666
+ resolved.push(item);
667
+ continue;
668
+ }
669
+ const fixed = item && typeof item === 'object' && item.kind === 'fixed' ? item.value : item;
670
+ const id = fixed && typeof fixed === 'object' ? browserId(fixed) : '';
671
+ const name = fixed && typeof fixed === 'object' ? (browserNames(fixed)[0] || '') : String(fixed ?? '').trim();
672
+ if (!id && /^\d{10,}$/.test(name))
673
+ throw new Error(`${step.type}.${key} 固定 Browser 只有 id、没有名称;必须按名称查询`);
674
+ if (!name)
675
+ throw new Error(`${step.type}.${key} 固定 Browser 只有 id、没有名称;必须按名称查询后校验 id`);
676
+ const resolvedParams = { ...(configured.params || {}) };
677
+ for (const [param, refs] of Object.entries(configured.paramRefs || {})) {
678
+ const candidates = Array.isArray(refs) ? refs : [refs];
679
+ const value = candidates.map((ref) => readObjectPath(params, ref)).find((candidate) => candidate !== undefined && candidate !== null && candidate !== '');
680
+ if (value !== undefined)
681
+ resolvedParams[param] = value;
682
+ }
683
+ const spec = { module: configured.module, type: configured.type, params: resolvedParams };
684
+ const cacheKey = `${spec.module}\u0000${spec.type}\u0000${JSON.stringify(spec.params || {})}\u0000${name}`;
685
+ let rows = cache.get(cacheKey);
686
+ if (!rows) {
687
+ rows = browserRows(await browserSource.browserComplete(client, spec, name));
688
+ cache.set(cacheKey, rows);
689
+ }
690
+ const matches = rows.filter((row) => browserNames(row).includes(name) && (!id || browserId(row) === id));
691
+ if (matches.length !== 1)
692
+ throw new Error(`${step.type}.${key} 未能从 ${spec.module}/${spec.type} 唯一匹配固定值 '${name}'(匹配数: ${matches.length})`);
693
+ resolved.push(matches[0]);
694
+ records.push({
695
+ path: `${step.type}.params.${key}`,
696
+ resourceType: `${spec.type}_browser`,
697
+ value: { id: browserId(matches[0]), name: browserNames(matches[0])[0] || name },
698
+ reason: `固定值已按名称通过 ${spec.module}/${spec.type} Browser 补全`,
699
+ });
700
+ }
701
+ params[key] = Array.isArray(raw) || fixedArray ? resolved : resolved[0];
702
+ }
703
+ }
704
+ }
705
+ if (records.length)
706
+ (plan._autoResources ??= []).push(...records);
707
+ return records;
708
+ }
709
+ function mergeLogicFlowInputParams(detailInput, current) {
710
+ const currentRows = new Map();
711
+ if (current && typeof current === 'object' && Array.isArray(current.tableData)) {
712
+ for (const row of current.tableData) {
713
+ if (!row || typeof row !== 'object')
714
+ continue;
715
+ const key = String(row.paramKey ?? row.paramName ?? '');
716
+ if (key)
717
+ currentRows.set(key, row);
718
+ }
719
+ }
720
+ const tableData = Array.isArray(detailInput.tableData) ? detailInput.tableData.map((row) => {
721
+ const detailRow = row && typeof row === 'object' ? { ...row } : row;
722
+ const key = String(detailRow?.paramKey ?? detailRow?.paramName ?? '');
723
+ const previous = currentRows.get(key);
724
+ if (previous?.formulaData !== undefined)
725
+ detailRow.formulaData = previous.formulaData;
726
+ return detailRow;
727
+ }) : [];
728
+ const roots = tableData
729
+ .filter((row) => row && (row.parentId === undefined || row.parentId === null || String(row.parentId) === ''))
730
+ .map((row) => String(row.id ?? row.paramId ?? '').trim())
731
+ .filter(Boolean);
732
+ return {
733
+ primaryKey: current?.primaryKey !== undefined ? current.primaryKey : '',
734
+ name: current?.name !== undefined ? current.name : '',
735
+ tableId: String(current?.tableId || genSfId()),
736
+ mappingTableId: String(current?.mappingTableId || genSfId()),
737
+ tableData,
738
+ deleteIds: current?.deleteIds !== undefined ? current.deleteIds : null,
739
+ expandRowKeys: Array.isArray(current?.expandRowKeys) && current.expandRowKeys.length ? current.expandRowKeys : roots,
740
+ basisValue: current?.basisValue !== undefined ? current.basisValue : null,
741
+ };
742
+ }
743
+ /** 规则 Browser 选中后,从远程规则详情补齐 inputParams。 */
744
+ export async function resolveLogicFlowInputParams(plan, client) {
745
+ const records = [];
746
+ for (const step of walkPlanSteps({ event: plan.event, actions: plan.actions || [] })) {
747
+ if (String(step.type || '') !== 'LogicFlowSet')
748
+ continue;
749
+ const params = step.params;
750
+ if (!params || typeof params !== 'object' || !Array.isArray(params.logicFlow) || !params.logicFlow.length)
751
+ continue;
752
+ const rule = params.logicFlow[0];
753
+ const ruleId = String(rule?.id || '').trim();
754
+ if (!ruleId)
755
+ throw new Error('LogicFlowSet.logicFlow[0] 缺少规则 ID,无法查询规则详情');
756
+ const response = await logicFlowSource.getLogicFlowInfo(client, ruleId);
757
+ const input = logicFlowSource.extractLogicFlowInput(response);
758
+ if (!input)
759
+ throw new Error(`LogicFlowSet 规则 '${ruleId}' 未返回 data.input,无法生成 inputParams`);
760
+ params.inputParams = mergeLogicFlowInputParams(input, params.inputParams);
761
+ records.push({
762
+ path: `${step.type}.params.inputParams`,
763
+ resourceType: 'logicflow_input_params',
764
+ value: { ruleId, tableData: params.inputParams.tableData },
765
+ reason: `规则详情接口已补齐规则 ${ruleId} 的 inputParams`,
766
+ });
767
+ }
768
+ if (records.length)
769
+ (plan._autoResources ??= []).push(...records);
770
+ return records;
771
+ }
528
772
  function documentFolderRows(response) {
529
773
  const data = response && typeof response === 'object' && 'data' in response ? response.data : response;
530
774
  if (Array.isArray(data))
@@ -551,6 +795,8 @@ function fixedDocumentFolderSelector(value) {
551
795
  if (isDynamicAssignment(value))
552
796
  return null;
553
797
  const raw = value && typeof value === 'object' && value.kind === 'fixed' ? value.value : value;
798
+ if (typeof raw === 'string' && raw.trim())
799
+ return { id: '', name: raw.trim() };
554
800
  if (!raw || typeof raw !== 'object' || Array.isArray(raw))
555
801
  return null;
556
802
  if (raw.type && raw.config && !raw.kind) {
@@ -593,8 +839,6 @@ export async function resolveFixedDocumentFolders(plan, client) {
593
839
  });
594
840
  if (!targets.length)
595
841
  return records;
596
- const rows = await documentSource.esbCreateFolderComponentFolder(client, '');
597
- const folders = documentFolderRows(rows);
598
842
  const cache = new Map();
599
843
  for (const step of targets) {
600
844
  const params = step.params || {};
@@ -607,12 +851,15 @@ export async function resolveFixedDocumentFolders(plan, client) {
607
851
  if (!selector || (!selector.id && !selector.name)) {
608
852
  throw new Error('DocumentSave.fileFolder 固定值必须包含真实文件夹 id 或 name;不能凭空生成目录对象');
609
853
  }
854
+ if (!selector.name)
855
+ throw new Error('DocumentSave.fileFolder 固定文件夹只有 id、没有名称;必须按名称查询后校验 id');
610
856
  const cacheKey = `${selector.id}\u0000${selector.name}`;
611
857
  let matches = cache.get(cacheKey);
612
858
  if (!matches) {
613
- matches = selector.id
614
- ? folders.filter((folder) => documentFolderId(folder) === selector.id)
615
- : folders.filter((folder) => documentFolderNames(folder).includes(selector.name));
859
+ const response = await documentSource.esbCreateFolderComponentFolder(client, selector.name);
860
+ const folders = documentFolderRows(response);
861
+ matches = folders.filter((folder) => documentFolderNames(folder).includes(selector.name)
862
+ && (!selector.id || documentFolderId(folder) === selector.id));
616
863
  cache.set(cacheKey, matches);
617
864
  }
618
865
  if (matches.length !== 1) {
@@ -638,6 +885,170 @@ function isDynamicAssignment(value) {
638
885
  function isEbuilderField(field) {
639
886
  return String(field?.componentKey || field?.fieldConfig?.componentKey || '').toLowerCase() === 'ebuilder';
640
887
  }
888
+ function fieldConfig(field) {
889
+ let config = field?.fieldConfig ?? field?.config ?? {};
890
+ if (typeof config === 'string') {
891
+ try {
892
+ config = JSON.parse(config);
893
+ }
894
+ catch {
895
+ config = {};
896
+ }
897
+ }
898
+ return config && typeof config === 'object' && !Array.isArray(config) ? config : {};
899
+ }
900
+ /** 对齐前端 set-formdata/utils.ts 的 componentKey -> browserBean 映射。 */
901
+ function formFieldBrowserSpec(field, form) {
902
+ const key = String(field?.componentKey || field?.fieldConfig?.componentKey || '').trim();
903
+ const config = fieldConfig(field);
904
+ const configured = config.browserType && typeof config.browserType === 'object' ? config.browserType : null;
905
+ if (key === 'RelateBrowser' && configured?.type && configured?.module) {
906
+ return { type: String(configured.type), module: String(configured.module), params: configured.params || {} };
907
+ }
908
+ if (key === 'Ebuilder')
909
+ return null; // 由 resolveEbuilderFixedValues 保留专用 header/formParam 协议。
910
+ const staticMap = {
911
+ Workflow: { type: 'wfcRequest', module: 'workflow' },
912
+ Department: { type: 'department', module: 'hrm' },
913
+ Subcompany: { type: 'subcompany', module: 'hrm' },
914
+ Employee: { type: 'resource', module: 'hrm' },
915
+ Mainline: { type: 'mainlineBrowser', module: 'project' },
916
+ Task: { type: 'taskBrowser', module: 'task' },
917
+ Document: { type: 'document', module: 'doc' },
918
+ AgendaComponent: { type: 'calendarBrowser', module: 'calendar' },
919
+ ClueComponent: { type: 'clue', module: 'crm' },
920
+ OrderComponent: { type: 'orderform', module: 'crm' },
921
+ WorkreportComponent: { type: 'planBrowser', module: 'plan' },
922
+ CompetitorComponent: { type: 'competitor', module: 'crm' },
923
+ KpiFlowComponent: { type: 'performanceBrowser', module: 'performance' },
924
+ QuoteComponent: { type: 'quote', module: 'crm' },
925
+ AttendComponent: { type: 'attendPermissionEmpsBrowser', module: 'attend' },
926
+ ODocReceiveComponent: { type: 'odocReceiveUnit', module: 'odoc' },
927
+ HrmGrade: { type: 'grade', module: 'hrm' },
928
+ HrmPosition: { type: 'position', module: 'hrm' },
929
+ CashBook: { type: 'cashbook', module: 'inc/book' },
930
+ RelateODoc: { type: 'odocRequest', module: 'odoc' },
931
+ EinvoiceComponent: { type: 'invoice', module: 'inc/biz' },
932
+ Invoice: { type: 'invoice', module: 'inc/biz' },
933
+ TreeSelect: { type: 'treeSelect', module: 'form' },
934
+ };
935
+ const hit = staticMap[key];
936
+ if (hit) {
937
+ const params = {};
938
+ if (key === 'TreeSelect') {
939
+ params.businessId = form.id || field.formId || '';
940
+ params.controlId = field.id || '';
941
+ }
942
+ return { ...hit, params };
943
+ }
944
+ // DataSource 的 browserBean 由 sourceModule 查前端 DataSourceType;
945
+ // 这里优先使用后端字段元数据已经展开的 browserType,再处理常见 sourceModule。
946
+ const sourceModule = String(field?.sourceModule || config.sourceModule || '').trim();
947
+ const dataSourceMap = {
948
+ vacation: { type: 'vacationTypeBrowser', module: 'attend/web' },
949
+ conferenceRoom: { type: 'mt_room', module: 'meeting' },
950
+ grade: { type: 'grade', module: 'hrm' },
951
+ position: { type: 'position', module: 'hrm' },
952
+ taskPriority: { type: 'taskPriorityBrowser', module: 'task' },
953
+ taskTypeForm: { type: 'taskTypeBrowser', module: 'task' },
954
+ mainlineStatus: { type: 'mainlineStatusBrowser', module: 'project' },
955
+ mainlinegroup: { type: 'mainlineGroupBrowser', module: 'project' },
956
+ templateId: { type: 'mainlineTemplateBrowser', module: 'project' },
957
+ secret: { type: 'calendarVisibleBrowser', module: 'calendar' },
958
+ };
959
+ const dataSource = dataSourceMap[sourceModule];
960
+ if (key === 'DataSource' && dataSource)
961
+ return { ...dataSource, params: config.params || {} };
962
+ return null;
963
+ }
964
+ function fixedFormBrowserValue(value) {
965
+ if (isDynamicAssignment(value))
966
+ return null;
967
+ const raw = value && typeof value === 'object' && value.kind === 'fixed' ? value.value : value;
968
+ if (raw && typeof raw === 'object') {
969
+ return {
970
+ id: String(raw.id ?? raw.value ?? raw.dataId ?? raw.objId ?? '').trim(),
971
+ name: String(raw.name ?? raw.showName ?? raw.content ?? raw.text ?? raw.title ?? raw.label ?? '').trim(),
972
+ };
973
+ }
974
+ const name = String(raw ?? '').trim();
975
+ return name ? { id: '', name } : null;
976
+ }
977
+ /** 表单字段固定值:按目标 componentKey 的 Browser 接口用名称匹配并校验可选 ID。 */
978
+ export async function resolveFormFieldBrowserFixedValues(plan, client) {
979
+ const records = [];
980
+ const cache = new Map();
981
+ const resolveContainer = async (container, fields, form, path) => {
982
+ for (const [fieldId, value] of Object.entries(container || {})) {
983
+ const normalizedId = String(fieldId).replace(/^[+-]/, '');
984
+ const field = fields[normalizedId];
985
+ const spec = field && formFieldBrowserSpec(field, form);
986
+ if (!spec || value == null || value === '' || isDynamicAssignment(value))
987
+ continue;
988
+ const selected = fixedFormBrowserValue(value);
989
+ if (!selected)
990
+ continue;
991
+ if (!selected.name)
992
+ throw new Error(`${path}.${fieldId} 固定浏览值只有 id、没有名称;必须按名称查询后校验 id`);
993
+ if (!selected.id && /^\d{10,}$/.test(selected.name)) {
994
+ throw new Error(`${path}.${fieldId} 固定浏览值只有 id、没有名称;必须按名称查询`);
995
+ }
996
+ const params = { ...(spec.params || {}) };
997
+ const cacheKey = `${spec.module}\u0000${spec.type}\u0000${JSON.stringify(params)}\u0000${selected.name}`;
998
+ let rows = cache.get(cacheKey);
999
+ if (!rows) {
1000
+ rows = browserRows(await browserSource.browserComplete(client, { ...spec, params }, selected.name));
1001
+ cache.set(cacheKey, rows);
1002
+ }
1003
+ const matches = rows.filter((row) => browserNames(row).includes(selected.name)
1004
+ && (!selected.id || browserId(row) === selected.id));
1005
+ if (matches.length !== 1) {
1006
+ throw new Error(`${path}.${fieldId} 未能从 ${spec.module}/${spec.type} 唯一匹配固定值 '${selected.name}'(匹配数: ${matches.length})`);
1007
+ }
1008
+ const browser = matches[0];
1009
+ if (value && typeof value === 'object' && value.kind === 'fixed')
1010
+ value.value = browser;
1011
+ else if (value && typeof value === 'object' && 'value' in value && !('id' in value))
1012
+ value.value = browser;
1013
+ else
1014
+ container[fieldId] = { kind: 'fixed', value: browser };
1015
+ records.push({
1016
+ path: `${path}.${fieldId}`, resourceType: `${spec.type}_browser`,
1017
+ value: { id: browserId(browser), name: browserNames(browser)[0] || selected.name },
1018
+ reason: `表单字段 ${field?.componentKey} 固定值已按名称通过 ${spec.module}/${spec.type} Browser 补全`,
1019
+ });
1020
+ }
1021
+ };
1022
+ const walk = async (steps) => {
1023
+ for (const step of steps || []) {
1024
+ if (!step || typeof step !== 'object')
1025
+ continue;
1026
+ const params = step.params || {};
1027
+ const form = stepFormRef(step) || {};
1028
+ let fields = form.id ? getTargetFormFields()[String(form.id)] || {} : {};
1029
+ if (!Object.keys(fields).length && params._bizFields?.main) {
1030
+ fields = Object.fromEntries((params._bizFields.main || []).filter((f) => f?.id).map((f) => [String(f.id), f]));
1031
+ }
1032
+ if (Object.keys(fields).length && params.constants && typeof params.constants === 'object' && !Array.isArray(params.constants)) {
1033
+ await resolveContainer(params.constants, fields, form, `${step.type}.params.constants`);
1034
+ }
1035
+ for (const item of Array.isArray(params.detail) ? params.detail : []) {
1036
+ if (!item || typeof item !== 'object' || !item.constants)
1037
+ continue;
1038
+ const detailFields = getTargetDetailFields()[String(form.id || '')]?.[String(item.detailTableId || item.tableId || '')] || {};
1039
+ await resolveContainer(item.constants, detailFields, form, `${step.type}.params.detail[${item.detailTableId || item.tableId || ''}].constants`);
1040
+ }
1041
+ for (const branch of getStepBranches(step) || [])
1042
+ await walk(branch?.actions || []);
1043
+ if (Array.isArray(step.actions))
1044
+ await walk(step.actions);
1045
+ }
1046
+ };
1047
+ await walk([plan.event, ...(plan.actions || [])]);
1048
+ if (records.length)
1049
+ (plan._autoResources ??= []).push(...records);
1050
+ return records;
1051
+ }
641
1052
  /** 从固定值中取出需要送给 Browser 搜索的名称。 */
642
1053
  function fixedBrowserSearchValue(value) {
643
1054
  if (isDynamicAssignment(value))
@@ -825,7 +1236,11 @@ export async function resolveBizCreateFields(step, plan, client, errors, path) {
825
1236
  if (data && typeof data === 'object') {
826
1237
  let main = Array.isArray(data.main) ? data.main : [];
827
1238
  const bizFields = {
1239
+ // 固定值浏览解析也依赖 fieldConfig/browserType/appId 等字段元数据,
1240
+ // 不能只保留 id/componentKey,否则 RelateBrowser/DataSource/Ebuilder
1241
+ // 会退化成普通字符串。
828
1242
  main: main.map((f) => ({
1243
+ ...f,
829
1244
  id: String(f.id || ''), showName: String(f.showName || ''),
830
1245
  componentKey: String(f.componentKey || ''), formId: String(f.formId || ''),
831
1246
  required: Boolean(f.required), custom: Boolean(f.custom), subFormId: String(f.subFormId || '-1'),
@@ -833,6 +1248,16 @@ export async function resolveBizCreateFields(step, plan, client, errors, path) {
833
1248
  detail: data.detail || [],
834
1249
  };
835
1250
  params._bizFields = bizFields;
1251
+ for (const fid of new Set(main.map((f) => String(f?.formId || '')).filter(Boolean))) {
1252
+ const formId = String(fid);
1253
+ registerTargetFormFields(formId, main.filter((f) => String(f?.formId || '') === formId));
1254
+ }
1255
+ for (const detail of data.detail || []) {
1256
+ const detailFormId = String(detail?.formId || main.find((f) => f?.formId)?.formId || '');
1257
+ if (detailFormId && detail?.detailTableId) {
1258
+ registerTargetDetailFields(detailFormId, String(detail.detailTableId), detail.fields || []);
1259
+ }
1260
+ }
836
1261
  let formIds = (wfPath.formIds ? (Array.isArray(wfPath.formIds) ? wfPath.formIds : [wfPath.formIds]) : []).map(String);
837
1262
  if (!formIds.length) {
838
1263
  formIds = [...new Set(main.map((f) => f && f.formId ? String(f.formId) : '').filter(Boolean))];
@@ -1509,6 +1934,30 @@ export function normalizeShowDataSourceFields(response, formId) {
1509
1934
  visit(root);
1510
1935
  return fields;
1511
1936
  }
1937
+ /**
1938
+ * 归一化前端 /component/getDataSourceFields 的返回值。
1939
+ *
1940
+ * 该接口与 showDataSourceFields 不同,前端直接把返回数组作为 Select 的
1941
+ * options 使用,通常是 [{ id, content, type }],不是 { fields: [...] }。
1942
+ */
1943
+ export function normalizeDataSourceSelectorFields(response, formId) {
1944
+ const root = Array.isArray(response)
1945
+ ? response
1946
+ : Array.isArray(response?.data)
1947
+ ? response.data
1948
+ : Array.isArray(response?.result)
1949
+ ? response.result
1950
+ : [];
1951
+ const direct = root
1952
+ .filter((field) => field && typeof field === 'object' && field.id && !Array.isArray(field.fields))
1953
+ .map((field) => ({
1954
+ ...field,
1955
+ id: String(field.id),
1956
+ formId: String(field.formId || formId),
1957
+ content: String(field.content || field.text || field.showName || field.name || field.id),
1958
+ }));
1959
+ return direct.length ? direct : normalizeShowDataSourceFields(response, formId);
1960
+ }
1512
1961
  /**
1513
1962
  * 归一化 /api/ebuilder/common/ds/fields 的字段对象。
1514
1963
  *
@@ -1797,6 +2246,24 @@ export async function preflightContext(plan, appId, client) {
1797
2246
  }
1798
2247
  await fillRequiredTriggerOperator(plan, client);
1799
2248
  await resolveFixedPeople(plan, client);
2249
+ try {
2250
+ await resolveFixedWorkflowInstances(plan, client);
2251
+ }
2252
+ catch (error) {
2253
+ errors.push(`流程实例 Browser 查询失败: ${String(error?.message || error)}`);
2254
+ }
2255
+ try {
2256
+ await resolveNamedFixedBrowsers(plan, client);
2257
+ }
2258
+ catch (error) {
2259
+ errors.push(`固定值 Browser 查询失败: ${String(error?.message || error)}`);
2260
+ }
2261
+ try {
2262
+ await resolveLogicFlowInputParams(plan, client);
2263
+ }
2264
+ catch (error) {
2265
+ errors.push(`规则集详情查询失败: ${String(error?.message || error)}`);
2266
+ }
1800
2267
  try {
1801
2268
  await resolveFixedDocumentFolders(plan, client);
1802
2269
  }
@@ -1833,8 +2300,12 @@ export async function preflightContext(plan, appId, client) {
1833
2300
  const tf = stepFormRef(step);
1834
2301
  if (tf && tf.id) {
1835
2302
  const formId = String(tf.id);
1836
- const fields = await getFormFieldsFull(formId, client, tf);
1837
- await hydrateReferenceFilterFields(plan, client, formId, tf, fields);
2303
+ const strictConditionSource = ['EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type);
2304
+ // 数据源查询/触发组件的字段不是普通 EB 表单字段:
2305
+ // 它们必须来自 /api/ebuilder/common/ds/fields,不能先调用 getEbField。
2306
+ let fields = strictConditionSource ? [] : await getFormFieldsFull(formId, client, tf);
2307
+ if (!strictConditionSource)
2308
+ await hydrateReferenceFilterFields(plan, client, formId, tf, fields);
1838
2309
  // “默认全选”必须在计划层固化为实时字段列表。仅在编译期依赖全局缓存时,
1839
2310
  // 查询组件偶尔会只保留系统字段,筛选编辑器因此把业务字段标成“已删除”。
1840
2311
  const params = step.params && typeof step.params === 'object' ? step.params : (step.params = {});
@@ -1844,18 +2315,70 @@ export async function preflightContext(plan, appId, client) {
1844
2315
  // 而不是只用 getEbField 的表单字段对象。后者经常缺少数据源侧的
1845
2316
  // name/formInfo/sformId,会导致设计器把条件字段显示为“已删除”
1846
2317
  // 或保存时静默丢弃。
2318
+ let dataSourceFields = [];
1847
2319
  try {
1848
2320
  const dataSourceResponse = await formSource.dataSourceFields(client, formId, true);
1849
- const dataSourceFields = normalizeShowDataSourceFields(dataSourceResponse, formId)
2321
+ dataSourceFields = normalizeShowDataSourceFields(dataSourceResponse, formId)
1850
2322
  .map((field) => normalizeDataSourceField(field, formId))
1851
2323
  .filter((field) => Boolean(field?.id));
2324
+ if (strictConditionSource)
2325
+ replaceTargetDataSourceFields(formId, dataSourceFields);
2326
+ if (strictConditionSource) {
2327
+ fields = dataSourceFields;
2328
+ await hydrateReferenceFilterFields(plan, client, formId, tf, fields);
2329
+ }
1852
2330
  if (dataSourceFields.length)
1853
2331
  registerTargetFormFields(formId, dataSourceFields);
2332
+ if (strictConditionSource && !dataSourceFields.length) {
2333
+ errors.push(`${step.type}.filterCondition: /api/ebuilder/common/ds/fields 未返回数据源字段,拒绝使用 getEbField 生成条件左值。`);
2334
+ }
1854
2335
  }
1855
- catch {
1856
- // 保留下方 showDataSourceFields/getEbField 降级;最终保存仍由平台校验。
2336
+ catch (error) {
2337
+ if (strictConditionSource) {
2338
+ replaceTargetDataSourceFields(formId, []);
2339
+ errors.push(`${step.type}.filterCondition: /api/ebuilder/common/ds/fields 查询失败,拒绝使用 getEbField 生成条件左值:${String(error?.message || error)}`);
2340
+ }
1857
2341
  }
1858
- // getEbField 用于类型/筛选校验;queryFields 必须采用设计器字段选择器
2342
+ if (step.type === 'EnquiryForm') {
2343
+ const groupFields = Array.isArray(params.groupFields) ? params.groupFields : [];
2344
+ const groupMessage = Array.isArray(params.groupMessage) ? params.groupMessage : [];
2345
+ const needsGroupFieldLookup = String(params.opType || 'list') === 'groupFields'
2346
+ || groupFields.length > 0 || groupMessage.length > 0;
2347
+ if (needsGroupFieldLookup) {
2348
+ try {
2349
+ const selectorResponse = await formSource.getDataSourceFields(client, String(tf.type || 'FORM'), String(tf.groupId || ''), formId);
2350
+ const selectorFields = normalizeDataSourceSelectorFields(selectorResponse, formId);
2351
+ const byId = new Map();
2352
+ for (const field of selectorFields) {
2353
+ const id = String(field?.id || '');
2354
+ if (!id)
2355
+ continue;
2356
+ byId.set(id, field);
2357
+ byId.set(id.startsWith('field_') ? id.slice('field_'.length) : `field_${id}`, field);
2358
+ }
2359
+ if (!selectorFields.length && (groupFields.length || groupMessage.length)) {
2360
+ errors.push('EnquiryForm.groupFields/groupMessage: /component/getDataSourceFields 未返回可选字段,拒绝凭空生成分组字段。');
2361
+ }
2362
+ for (const [key, items] of [['groupFields', groupFields], ['groupMessage', groupMessage]]) {
2363
+ for (const [index, item] of items.entries()) {
2364
+ const requestedId = String(item?.field || '');
2365
+ const live = byId.get(requestedId);
2366
+ if (!requestedId || !live) {
2367
+ errors.push(`EnquiryForm.${key}[${index}].field='${requestedId}' 不在 /component/getDataSourceFields 返回的实时字段中。`);
2368
+ }
2369
+ else {
2370
+ // 保留用户的行 id/aggregator,只把字段 ID 收敛为前端真实选项 ID。
2371
+ item.field = String(live.id);
2372
+ }
2373
+ }
2374
+ }
2375
+ }
2376
+ catch (error) {
2377
+ errors.push(`EnquiryForm.groupFields/groupMessage: /component/getDataSourceFields 查询失败,拒绝生成分组字段:${String(error?.message || error)}`);
2378
+ }
2379
+ }
2380
+ }
2381
+ // 条件左值已经固定使用 ds/fields;queryFields 仍采用设计器字段选择器
1859
2382
  // showDataSourceFields 返回的对象和字段 ID(业务字段通常是 field_<真实ID>),
1860
2383
  // 否则后端会静默丢弃业务字段。
1861
2384
  let selectable = [];
@@ -1866,7 +2389,7 @@ export async function preflightContext(plan, appId, client) {
1866
2389
  selectable = normalizeShowDataSourceFields(resp, formId);
1867
2390
  }
1868
2391
  catch {
1869
- // 接口异常时保留下方基于 getEbField 的降级;最终保存仍由平台严格校验。
2392
+ // 接口异常时不把 getEbField 混入条件左值;最终保存仍由平台严格校验。
1870
2393
  }
1871
2394
  if (step.type === 'EnquiryForm') {
1872
2395
  const formName = String(tf.text || tf.name || fields.find((f) => f?.fieldGroup?.name)?.fieldGroup?.name || '表单数据');
@@ -2027,9 +2550,9 @@ export async function preflightContext(plan, appId, client) {
2027
2550
  for (const f of v.fields || []) {
2028
2551
  if (!f || typeof f !== 'object')
2029
2552
  continue;
2030
- const tablePrimaryKey = String(f.tablePrimaryKey || v.primaryKey || v.key || '').trim();
2031
- const tableName = String(f.tableName || v.name || v.label || tablePrimaryKey).trim();
2032
2553
  const componentType = f.componentType || v.component;
2554
+ const tablePrimaryKey = resolveContextGroupRoot(f, v, componentType);
2555
+ const tableName = String(f.tableName || v.name || v.label || tablePrimaryKey).trim();
2033
2556
  if (f.showName && f.componentKey)
2034
2557
  eventFieldTypes[String(f.showName)] = String(f.componentKey);
2035
2558
  if (f.showName) {
@@ -2198,6 +2721,15 @@ export async function preflightContext(plan, appId, client) {
2198
2721
  }
2199
2722
  };
2200
2723
  await walk(plan.actions || [], store, 'actions');
2724
+ // 目标表单字段元数据在上面的 walk 中已完成(ApproveCreate 也会在此处
2725
+ // 拉取 _bizFields),现在统一处理所有 componentKey 对应的固定 Browser 值。
2726
+ // 动态赋值、函数和循环引用由公式编译链继续处理,不在这里查询。
2727
+ try {
2728
+ await resolveFormFieldBrowserFixedValues(plan, client);
2729
+ }
2730
+ catch (error) {
2731
+ errors.push(`表单字段固定 Browser 查询失败: ${String(error?.message || error)}`);
2732
+ }
2201
2733
  // 源字段硬性校验
2202
2734
  checkSourceReferences(plan, eventContextFields, errors, store.asDict());
2203
2735
  if (errors.length) {