weaver-e10-builder 1.5.16 → 1.6.4

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 (232) hide show
  1. package/dist/commands/auth.d.ts.map +1 -1
  2. package/dist/commands/auth.js +4 -2
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +109 -51
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/form-attachment-setting.d.ts +3 -0
  8. package/dist/commands/form-attachment-setting.d.ts.map +1 -0
  9. package/dist/commands/form-attachment-setting.js +422 -0
  10. package/dist/commands/form-attachment-setting.js.map +1 -0
  11. package/dist/commands/form-data.d.ts.map +1 -1
  12. package/dist/commands/form-data.js +49 -1
  13. package/dist/commands/form-data.js.map +1 -1
  14. package/dist/commands/form-ebuilder-scope.d.ts +21 -0
  15. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  16. package/dist/commands/form-ebuilder-scope.js +41 -8
  17. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  18. package/dist/commands/form-field-linkage.d.ts +6 -1
  19. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  20. package/dist/commands/form-field-linkage.js +138 -31
  21. package/dist/commands/form-field-linkage.js.map +1 -1
  22. package/dist/commands/form-layout-code-reviewed.d.ts +3 -0
  23. package/dist/commands/form-layout-code-reviewed.d.ts.map +1 -0
  24. package/dist/commands/form-layout-code-reviewed.js +61 -0
  25. package/dist/commands/form-layout-code-reviewed.js.map +1 -0
  26. package/dist/commands/form-layout-describe.d.ts +3 -0
  27. package/dist/commands/form-layout-describe.d.ts.map +1 -0
  28. package/dist/commands/form-layout-describe.js +58 -0
  29. package/dist/commands/form-layout-describe.js.map +1 -0
  30. package/dist/commands/form-layout-diff.d.ts +3 -0
  31. package/dist/commands/form-layout-diff.d.ts.map +1 -0
  32. package/dist/commands/form-layout-diff.js +48 -0
  33. package/dist/commands/form-layout-diff.js.map +1 -0
  34. package/dist/commands/form-layout-document.d.ts +3 -0
  35. package/dist/commands/form-layout-document.d.ts.map +1 -0
  36. package/dist/commands/form-layout-document.js +81 -0
  37. package/dist/commands/form-layout-document.js.map +1 -0
  38. package/dist/commands/form-layout-edit.d.ts +3 -0
  39. package/dist/commands/form-layout-edit.d.ts.map +1 -0
  40. package/dist/commands/form-layout-edit.js +51 -0
  41. package/dist/commands/form-layout-edit.js.map +1 -0
  42. package/dist/commands/form-layout-init-reviewed.d.ts +3 -0
  43. package/dist/commands/form-layout-init-reviewed.d.ts.map +1 -0
  44. package/dist/commands/form-layout-init-reviewed.js +78 -0
  45. package/dist/commands/form-layout-init-reviewed.js.map +1 -0
  46. package/dist/commands/form-layout-restore.d.ts.map +1 -1
  47. package/dist/commands/form-layout-restore.js +23 -0
  48. package/dist/commands/form-layout-restore.js.map +1 -1
  49. package/dist/commands/form-layout-template-catalog.d.ts +3 -0
  50. package/dist/commands/form-layout-template-catalog.d.ts.map +1 -0
  51. package/dist/commands/form-layout-template-catalog.js +45 -0
  52. package/dist/commands/form-layout-template-catalog.js.map +1 -0
  53. package/dist/commands/form.d.ts.map +1 -1
  54. package/dist/commands/form.js +80 -5
  55. package/dist/commands/form.js.map +1 -1
  56. package/dist/commands/project.d.ts.map +1 -1
  57. package/dist/commands/project.js +39 -6
  58. package/dist/commands/project.js.map +1 -1
  59. package/dist/index.js +15 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  62. package/dist/services/actionflow/components/action_eb_add.js +12 -5
  63. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_add_compiler.d.ts.map +1 -1
  65. package/dist/services/actionflow/components/action_eb_add_compiler.js +5 -0
  66. package/dist/services/actionflow/components/action_eb_add_compiler.js.map +1 -1
  67. package/dist/services/actionflow/components/action_eb_delete.d.ts +6 -1
  68. package/dist/services/actionflow/components/action_eb_delete.d.ts.map +1 -1
  69. package/dist/services/actionflow/components/action_eb_delete.js +23 -5
  70. package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
  71. package/dist/services/actionflow/components/action_eb_delete_compiler.d.ts.map +1 -1
  72. package/dist/services/actionflow/components/action_eb_delete_compiler.js +22 -0
  73. package/dist/services/actionflow/components/action_eb_delete_compiler.js.map +1 -1
  74. package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
  75. package/dist/services/actionflow/components/action_eb_update.js +13 -4
  76. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  77. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  78. package/dist/services/actionflow/components/action_eb_update_compiler.js +9 -2
  79. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  80. package/dist/services/actionflow/components/date_trigger.js +2 -2
  81. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  82. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/enquiry_form.js +11 -10
  84. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  85. package/dist/services/actionflow/components/event_button.js +1 -1
  86. package/dist/services/actionflow/components/event_button.js.map +1 -1
  87. package/dist/services/actionflow/components/form_data_builder.d.ts +29 -1
  88. package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
  89. package/dist/services/actionflow/components/form_data_builder.js +67 -3
  90. package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
  91. package/dist/services/actionflow/components/time_batch_trigger.js +2 -2
  92. package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
  93. package/dist/services/actionflow/form_source.d.ts +44 -1
  94. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  95. package/dist/services/actionflow/form_source.js +231 -5
  96. package/dist/services/actionflow/form_source.js.map +1 -1
  97. package/dist/services/actionflow/preflight_service.d.ts +8 -0
  98. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  99. package/dist/services/actionflow/preflight_service.js +120 -14
  100. package/dist/services/actionflow/preflight_service.js.map +1 -1
  101. package/dist/services/actionflow/system_params.d.ts.map +1 -1
  102. package/dist/services/actionflow/system_params.js +4 -1
  103. package/dist/services/actionflow/system_params.js.map +1 -1
  104. package/dist/services/actionflow/trigger_common.d.ts.map +1 -1
  105. package/dist/services/actionflow/trigger_common.js +12 -3
  106. package/dist/services/actionflow/trigger_common.js.map +1 -1
  107. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  108. package/dist/services/actionflow/workflow_compiler.js +117 -40
  109. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  110. package/dist/services/form-attachment-settings.d.ts +110 -0
  111. package/dist/services/form-attachment-settings.d.ts.map +1 -0
  112. package/dist/services/form-attachment-settings.js +332 -0
  113. package/dist/services/form-attachment-settings.js.map +1 -0
  114. package/dist/services/form-attachment-upload.d.ts +30 -0
  115. package/dist/services/form-attachment-upload.d.ts.map +1 -0
  116. package/dist/services/form-attachment-upload.js +76 -0
  117. package/dist/services/form-attachment-upload.js.map +1 -0
  118. package/dist/services/form-data-openapi.d.ts +2 -0
  119. package/dist/services/form-data-openapi.d.ts.map +1 -1
  120. package/dist/services/form-data-openapi.js +1 -0
  121. package/dist/services/form-data-openapi.js.map +1 -1
  122. package/dist/services/form-layout-code-reviewed.d.ts +32 -0
  123. package/dist/services/form-layout-code-reviewed.d.ts.map +1 -0
  124. package/dist/services/form-layout-code-reviewed.js +101 -0
  125. package/dist/services/form-layout-code-reviewed.js.map +1 -0
  126. package/dist/services/form-layout-describe.d.ts +4 -0
  127. package/dist/services/form-layout-describe.d.ts.map +1 -0
  128. package/dist/services/form-layout-describe.js +107 -0
  129. package/dist/services/form-layout-describe.js.map +1 -0
  130. package/dist/services/form-layout-diff.d.ts +37 -0
  131. package/dist/services/form-layout-diff.d.ts.map +1 -0
  132. package/dist/services/form-layout-diff.js +232 -0
  133. package/dist/services/form-layout-diff.js.map +1 -0
  134. package/dist/services/form-layout-document-apply.d.ts +23 -0
  135. package/dist/services/form-layout-document-apply.d.ts.map +1 -0
  136. package/dist/services/form-layout-document-apply.js +82 -0
  137. package/dist/services/form-layout-document-apply.js.map +1 -0
  138. package/dist/services/form-layout-document.d.ts +13 -0
  139. package/dist/services/form-layout-document.d.ts.map +1 -0
  140. package/dist/services/form-layout-document.js +228 -0
  141. package/dist/services/form-layout-document.js.map +1 -0
  142. package/dist/services/form-layout-edit.d.ts +21 -0
  143. package/dist/services/form-layout-edit.d.ts.map +1 -0
  144. package/dist/services/form-layout-edit.js +103 -0
  145. package/dist/services/form-layout-edit.js.map +1 -0
  146. package/dist/services/form-layout-init-plan.d.ts +54 -0
  147. package/dist/services/form-layout-init-plan.d.ts.map +1 -0
  148. package/dist/services/form-layout-init-plan.js +211 -0
  149. package/dist/services/form-layout-init-plan.js.map +1 -0
  150. package/dist/services/form-layout-source/review.d.ts +4 -0
  151. package/dist/services/form-layout-source/review.d.ts.map +1 -0
  152. package/dist/services/form-layout-source/review.js +54 -0
  153. package/dist/services/form-layout-source/review.js.map +1 -0
  154. package/dist/services/form-layout-template-advanced.d.ts +5 -0
  155. package/dist/services/form-layout-template-advanced.d.ts.map +1 -1
  156. package/dist/services/form-layout-template-advanced.js +17 -1
  157. package/dist/services/form-layout-template-advanced.js.map +1 -1
  158. package/dist/services/form-layout-template-catalog.d.ts +13 -0
  159. package/dist/services/form-layout-template-catalog.d.ts.map +1 -0
  160. package/dist/services/form-layout-template-catalog.js +27 -0
  161. package/dist/services/form-layout-template-catalog.js.map +1 -0
  162. package/dist/services/form-layout-template-flow.d.ts +1 -1
  163. package/dist/services/form-layout-template-flow.d.ts.map +1 -1
  164. package/dist/services/form-layout-template-flow.js.map +1 -1
  165. package/dist/services/form-layout-template-verification.d.ts +34 -0
  166. package/dist/services/form-layout-template-verification.d.ts.map +1 -0
  167. package/dist/services/form-layout-template-verification.js +124 -0
  168. package/dist/services/form-layout-template-verification.js.map +1 -0
  169. package/dist/services/form-style-template.d.ts +3 -3
  170. package/dist/services/form-style-template.d.ts.map +1 -1
  171. package/dist/services/form-style-template.js +18 -13
  172. package/dist/services/form-style-template.js.map +1 -1
  173. package/package.json +1 -1
  174. package/skill-docs/SKILL.md +163 -155
  175. package/skill-docs/_catalog.md +110 -106
  176. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +60 -3
  177. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +35 -33
  178. package/skill-docs/assets/sample/api/formApi.js +689 -510
  179. package/skill-docs/assets/sample/app/config.js +4 -0
  180. package/skill-docs/assets/sample/app/fields.js +25 -0
  181. package/skill-docs/assets/sample/entry.js +24 -22
  182. package/skill-docs/assets/sample/eslint.config.cjs +1 -0
  183. package/skill-docs/assets/sample/pages/Items.js +247 -0
  184. package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
  185. package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
  186. package/skill-docs/references/coding/guide-form-crud.md +195 -172
  187. package/skill-docs/references/coding/guide-html-to-react.md +250 -0
  188. package/skill-docs/references/coding/guide-page-code.md +194 -167
  189. package/skill-docs/references/coding/guide-page-export.md +27 -18
  190. package/skill-docs/references/coding/ref-compile-rules.md +7 -7
  191. package/skill-docs/references/common/capability-boundaries.md +20 -1
  192. package/skill-docs/references/common/guide-plan-template.md +29 -3
  193. package/skill-docs/references/common/map.md +13 -8
  194. package/skill-docs/references/common/ref-cli-commands.md +31 -10
  195. package/skill-docs/references/components/display-FilePreview.md +5 -4
  196. package/skill-docs/references/form/guide-browser-definition.md +57 -13
  197. package/skill-docs/references/form/guide-create-form.md +258 -258
  198. package/skill-docs/references/form/guide-field-linkage.md +4 -1
  199. package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
  200. package/skill-docs/references/form/guide-form-data.md +22 -1
  201. package/skill-docs/references/form/layout/code-block/code-block-guide.md +153 -0
  202. package/skill-docs/references/form/layout/code-block/controls.md +60 -0
  203. package/skill-docs/references/form/layout/code-block/coverage.md +32 -0
  204. package/skill-docs/references/form/layout/code-block/details.md +57 -0
  205. package/skill-docs/references/form/layout/code-block/events-validation.md +42 -0
  206. package/skill-docs/references/form/layout/code-block/foundations-fields.md +56 -0
  207. package/skill-docs/references/form/layout/code-block/layout-css.md +116 -0
  208. package/skill-docs/references/form/layout/code-block/recipes.md +164 -0
  209. package/skill-docs/references/form/layout/code-block/troubleshooting.md +49 -0
  210. package/skill-docs/references/form/layout/code-block/ui-global.md +47 -0
  211. package/skill-docs/references/form/layout/document.md +39 -0
  212. package/skill-docs/references/form/layout/incremental.md +133 -0
  213. package/skill-docs/references/form/layout/initialization.md +39 -0
  214. package/skill-docs/references/form/layout/inspect-edit.md +76 -0
  215. package/skill-docs/references/form/layout/layout-overview.md +67 -0
  216. package/skill-docs/references/form/layout/management.md +64 -0
  217. package/skill-docs/references/form/layout/planning.md +76 -0
  218. package/skill-docs/references/form/layout/source-restoration.md +388 -0
  219. package/skill-docs/references/form/layout/template/advanced-css.md +167 -0
  220. package/skill-docs/references/form/layout/template/advanced.md +318 -0
  221. package/skill-docs/references/form/layout/template/easy.md +64 -0
  222. package/skill-docs/references/form/layout/template/flow.md +30 -0
  223. package/skill-docs/references/form/layout/template/template-guide.md +56 -0
  224. package/skill-docs/references/form/layout/workflow-layout.md +44 -0
  225. package/skill-docs/references/form/ref-form-fields.md +303 -301
  226. package/skill-docs/references/workflow/guide-workflow-node-layout.md +189 -187
  227. package/skill-docs/assets/sample/config/config.js +0 -0
  228. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  229. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  230. package/skill-docs/assets/sample/config/config_default.js +0 -0
  231. package/skill-docs/assets/sample/memo.md +0 -0
  232. package/skill-docs/assets/sample/readme.js +0 -8
@@ -22,6 +22,86 @@ import { genSfId } from './id_generator.js';
22
22
  const FORM_FIELDS_CACHE = {};
23
23
  const FORM_LIST_CACHE = {};
24
24
  const FORM_LAYOUT_ID_CACHE = {};
25
+ function buttonRows(response) {
26
+ const data = response?.data ?? response;
27
+ for (const rows of [data?.data, data?.rows, data?.list, data?.records, data]) {
28
+ if (Array.isArray(rows))
29
+ return rows.filter((row) => row && typeof row === 'object');
30
+ }
31
+ return [];
32
+ }
33
+ function buttonId(row) {
34
+ return String(row?.id ?? row?.buttonId ?? row?.value ?? '').trim();
35
+ }
36
+ function buttonName(row) {
37
+ return String(row?.name ?? row?.content ?? row?.text ?? '').trim();
38
+ }
39
+ function supportsTriggerBefore(row) {
40
+ const value = row?.needTriggerBefore;
41
+ return value === true || value === 1 || value === '1' || String(value).toLowerCase() === 'true';
42
+ }
43
+ /**
44
+ * 按前端 EventButton 的真实按钮列表归一化按钮触发配置。
45
+ * 前端 eventButton/index.tsx 会用 needTriggerBefore 控制“执行前”下拉框,
46
+ * 因此 CLI 不能只校验 buttonLocation 枚举,还必须确认当前按钮确实支持 before。
47
+ */
48
+ export function normalizeEventButtonSelection(selected, available) {
49
+ if (!Array.isArray(selected) || selected.length === 0) {
50
+ throw new Error('EventButton.buttonType 必须至少选择一个真实按钮');
51
+ }
52
+ if (!available.length) {
53
+ throw new Error('EventButton.buttonType 查询不到当前表单可绑定的真实按钮');
54
+ }
55
+ const byId = new Map(available
56
+ .map((row) => [buttonId(row), row])
57
+ .filter(([id]) => Boolean(id)));
58
+ return selected.map((item, index) => {
59
+ const requested = item && typeof item === 'object' ? item : {};
60
+ const id = String(requested.id || '').trim();
61
+ const location = String(requested.buttonLocation || '').trim();
62
+ if (!id)
63
+ throw new Error(`EventButton.buttonType[${index}].id 缺失;必须使用 form-buttons 返回的真实按钮 ID`);
64
+ if (!['before', 'after'].includes(location)) {
65
+ throw new Error(`EventButton.buttonType[${index}].buttonLocation 仅支持 before 或 after`);
66
+ }
67
+ const live = byId.get(id);
68
+ if (!live)
69
+ throw new Error(`EventButton.buttonType[${index}] 的按钮 ID '${id}' 不属于当前表单真实按钮列表`);
70
+ if (location === 'before' && !supportsTriggerBefore(live)) {
71
+ const name = buttonName(live) || String(requested.name || id);
72
+ throw new Error(`EventButton.buttonType[${index}] 按钮“${name}”不支持执行前触发(前端 needTriggerBefore 未开启)`);
73
+ }
74
+ return {
75
+ ...requested,
76
+ id,
77
+ // 以当前租户按钮列表的名称为准,避免计划中的旧名称被原样写回。
78
+ name: buttonName(live) || String(requested.name || '').trim(),
79
+ buttonLocation: location,
80
+ asyncExecution: requested.asyncExecution ?? false,
81
+ };
82
+ });
83
+ }
84
+ /** 查询并校验 EventButton 的真实按钮及“执行前”能力。 */
85
+ export async function resolveEventButtonSelection(plan, client) {
86
+ const event = plan.event;
87
+ if (!event || typeof event !== 'object' || String(event.type || '') !== 'EventButton')
88
+ return [];
89
+ const params = event.params ??= {};
90
+ const targetForm = params.targetForm;
91
+ const formId = String(targetForm?.id || targetForm?.objId || '').trim();
92
+ const appId = String(targetForm?.groupId || targetForm?.appId || '').trim();
93
+ if (!formId || !appId)
94
+ throw new Error('EventButton.targetForm 必须包含真实表单 id 和 groupId,才能查询按钮列表');
95
+ const response = await formSource.getButtons(client, formId, appId);
96
+ const normalized = normalizeEventButtonSelection(params.buttonType, buttonRows(response));
97
+ params.buttonType = normalized;
98
+ return normalized.map((button) => ({
99
+ path: 'event.params.buttonType',
100
+ resourceType: 'ebuilder_button',
101
+ value: { id: button.id, name: button.name, buttonLocation: button.buttonLocation },
102
+ reason: '按钮已从当前租户表单按钮列表校验,执行前触发同时校验 needTriggerBefore',
103
+ }));
104
+ }
25
105
  /** 取得计划选择的流程表单(objId),用于 Workflow 条件左值的关联对象元数据。 */
26
106
  async function resolveWorkflowFormObject(plan, client, groupId) {
27
107
  const eventParams = plan.event?.params || {};
@@ -106,6 +186,11 @@ export function stepFormRef(step) {
106
186
  ref = step.dataSource || step.targetForm;
107
187
  return ref && typeof ref === 'object' ? ref : null;
108
188
  }
189
+ function needsLegacyFormResolution(ref) {
190
+ if (!ref || typeof ref !== 'object')
191
+ return false;
192
+ return formSource.actionflowDataSourceKind(ref) === 'ebuilder';
193
+ }
109
194
  /** 查 form-fields 返回完整字段列表(id/showName/componentKey/paramType),进程缓存。 */
110
195
  export async function getFormFieldsFull(formId, client, tf) {
111
196
  if (formId in FORM_FIELDS_CACHE) {
@@ -269,7 +354,7 @@ export async function resolveTargetForms(plan, client) {
269
354
  if (['EventFormData', 'EventButton', 'TimeBatchTrigger', 'DateTrigger', 'EnquiryForm'].includes(step.type)) {
270
355
  const ds = (step.params || {}).dataSource || (step.params || {}).targetForm;
271
356
  if (ds && typeof ds === 'object' && ds.id) {
272
- if (!ds.groupId || !ds.name || !ds.text || !ds.groupName)
357
+ if (needsLegacyFormResolution(ds) && (!ds.groupId || !ds.name || !ds.text || !ds.groupName))
273
358
  unresolved.push(String(ds.id));
274
359
  }
275
360
  }
@@ -280,7 +365,7 @@ export async function resolveTargetForms(plan, client) {
280
365
  if (ep && typeof ep === 'object') {
281
366
  const es = ep.targetForm || ep.dataSource;
282
367
  if (es && typeof es === 'object' && es.id) {
283
- if (!es.groupId || !es.name || !es.text || !es.groupName)
368
+ if (needsLegacyFormResolution(es) && (!es.groupId || !es.name || !es.text || !es.groupName))
284
369
  unresolved.push(String(es.id));
285
370
  }
286
371
  }
@@ -308,8 +393,10 @@ export async function resolveTargetForms(plan, client) {
308
393
  const groupForms = async (groupId) => {
309
394
  const idx = {};
310
395
  try {
311
- const forms = await formSource.dsList(client, groupId);
312
- for (const f of forms?.data || []) {
396
+ // 数据源 Browser 已废弃旧的 sourceType=FORM 列表协议;按前端 listByPage
397
+ // 使用 LOGIC + e-builder 服务组,避免预检阶段又走回旧接口。
398
+ const forms = await formSource.dsListByPage(client, 'ebuilder', { appId: groupId, pageSize: 500 });
399
+ for (const f of formSource.dataSourceRows(forms)) {
313
400
  if (f && typeof f === 'object' && f.id) {
314
401
  idx[String(f.id)] = { groupId, groupName: await applicationName(groupId), name: String(f.name || '') };
315
402
  }
@@ -2270,6 +2357,14 @@ export async function preflightContext(plan, appId, client) {
2270
2357
  catch (error) {
2271
2358
  errors.push(`DocumentSave 目标文件夹查询失败: ${String(error?.message || error)}`);
2272
2359
  }
2360
+ try {
2361
+ // 三类数据源统一先走前端 Browser:已有真实 id 的引用只补协议,
2362
+ // 仅提供名称时才调用对应的 EBUILDER/业务模块/数据准备接口检索。
2363
+ await formSource.resolveActionflowDataSources(plan, client);
2364
+ }
2365
+ catch (error) {
2366
+ errors.push(`动作流数据源 Browser 查询失败: ${String(error?.message || error)}`);
2367
+ }
2273
2368
  await resolveEntrustFields(plan, client, errors);
2274
2369
  await resolveHrmFieldAssignments(plan, client, errors);
2275
2370
  await resolveHrmAlterTypeFieldAssignments(plan, client, errors);
@@ -2291,6 +2386,16 @@ export async function preflightContext(plan, appId, client) {
2291
2386
  catch {
2292
2387
  // 忽略
2293
2388
  }
2389
+ // EventButton 的 targetForm 可能只提供表单 id;先完成 targetForm 的实时归属回填,
2390
+ // 再按前端 getButtonList 校验真实按钮以及 before 能力。
2391
+ try {
2392
+ const buttonResources = await resolveEventButtonSelection(plan, client);
2393
+ if (buttonResources.length)
2394
+ (plan._autoResources ??= []).push(...buttonResources);
2395
+ }
2396
+ catch (error) {
2397
+ errors.push(`EventButton 按钮查询/执行前能力校验失败: ${String(error?.message || error)}`);
2398
+ }
2294
2399
  // 查并登记所有目标表单字段元数据(转换前必须有 fieldType/componentKey)
2295
2400
  const hydrateFilterFields = async (steps) => {
2296
2401
  for (const step of steps || []) {
@@ -2300,7 +2405,10 @@ export async function preflightContext(plan, appId, client) {
2300
2405
  const tf = stepFormRef(step);
2301
2406
  if (tf && tf.id) {
2302
2407
  const formId = String(tf.id);
2303
- const strictConditionSource = ['EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type);
2408
+ // 删除表单数据的前端 ConditionSet 也绑定 dataSource 字段选择器,
2409
+ // 条件左值必须和前端一样来自 /api/ebuilder/common/ds/fields。
2410
+ const strictConditionSource = ['ActionEbDelete', 'EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type);
2411
+ const sourceProtocol = formSource.actionflowDataSourceProtocol(tf);
2304
2412
  // 数据源查询/触发组件的字段不是普通 EB 表单字段:
2305
2413
  // 它们必须来自 /api/ebuilder/common/ds/fields,不能先调用 getEbField。
2306
2414
  let fields = strictConditionSource ? [] : await getFormFieldsFull(formId, client, tf);
@@ -2309,7 +2417,7 @@ export async function preflightContext(plan, appId, client) {
2309
2417
  // “默认全选”必须在计划层固化为实时字段列表。仅在编译期依赖全局缓存时,
2310
2418
  // 查询组件偶尔会只保留系统字段,筛选编辑器因此把业务字段标成“已删除”。
2311
2419
  const params = step.params && typeof step.params === 'object' ? step.params : (step.params = {});
2312
- if (['EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type)
2420
+ if (['ActionEbDelete', 'EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type)
2313
2421
  || (step.type === 'ActionEbUpdate' && ['updateData', 'fieldUpdate'].includes(String(params.opType || 'updateData')))) {
2314
2422
  // EnquiryForm/条件更新的筛选条件左值必须来自数据源字段选择器,
2315
2423
  // 而不是只用 getEbField 的表单字段对象。后者经常缺少数据源侧的
@@ -2317,7 +2425,7 @@ export async function preflightContext(plan, appId, client) {
2317
2425
  // 或保存时静默丢弃。
2318
2426
  let dataSourceFields = [];
2319
2427
  try {
2320
- const dataSourceResponse = await formSource.dataSourceFields(client, formId, true);
2428
+ const dataSourceResponse = await formSource.dataSourceFields(client, formId, true, sourceProtocol);
2321
2429
  dataSourceFields = normalizeShowDataSourceFields(dataSourceResponse, formId)
2322
2430
  .map((field) => normalizeDataSourceField(field, formId))
2323
2431
  .filter((field) => Boolean(field?.id));
@@ -2329,12 +2437,12 @@ export async function preflightContext(plan, appId, client) {
2329
2437
  }
2330
2438
  if (dataSourceFields.length)
2331
2439
  registerTargetFormFields(formId, dataSourceFields);
2332
- if (strictConditionSource && !dataSourceFields.length) {
2440
+ if (strictConditionSource && sourceProtocol.kind !== 'data_processing' && !dataSourceFields.length) {
2333
2441
  errors.push(`${step.type}.filterCondition: /api/ebuilder/common/ds/fields 未返回数据源字段,拒绝使用 getEbField 生成条件左值。`);
2334
2442
  }
2335
2443
  }
2336
2444
  catch (error) {
2337
- if (strictConditionSource) {
2445
+ if (strictConditionSource && sourceProtocol.kind !== 'data_processing') {
2338
2446
  replaceTargetDataSourceFields(formId, []);
2339
2447
  errors.push(`${step.type}.filterCondition: /api/ebuilder/common/ds/fields 查询失败,拒绝使用 getEbField 生成条件左值:${String(error?.message || error)}`);
2340
2448
  }
@@ -2346,7 +2454,7 @@ export async function preflightContext(plan, appId, client) {
2346
2454
  || groupFields.length > 0 || groupMessage.length > 0;
2347
2455
  if (needsGroupFieldLookup) {
2348
2456
  try {
2349
- const selectorResponse = await formSource.getDataSourceFields(client, String(tf.type || 'FORM'), String(tf.groupId || ''), formId);
2457
+ const selectorResponse = await formSource.getDataSourceFields(client, sourceProtocol.sourceType, sourceProtocol.groupId, formId);
2350
2458
  const selectorFields = normalizeDataSourceSelectorFields(selectorResponse, formId);
2351
2459
  const byId = new Map();
2352
2460
  for (const field of selectorFields) {
@@ -2383,9 +2491,7 @@ export async function preflightContext(plan, appId, client) {
2383
2491
  // 否则后端会静默丢弃业务字段。
2384
2492
  let selectable = [];
2385
2493
  try {
2386
- // EnquiryForm 编译后数据源的服务组固定为 weaver-ebuilder-form-service;
2387
- // tf.groupId 是业务应用 ID,传它会得到空字段列表,进而把 queryFields 留成不完整的 plan 对象。
2388
- const resp = await formSource.showDataSourceFields(client, formId, 'weaver-ebuilder-form-service', 'LOGIC');
2494
+ const resp = await formSource.showDataSourceFields(client, formId, sourceProtocol.groupId, sourceProtocol.sourceType);
2389
2495
  selectable = normalizeShowDataSourceFields(resp, formId);
2390
2496
  }
2391
2497
  catch {
@@ -2396,7 +2502,7 @@ export async function preflightContext(plan, appId, client) {
2396
2502
  let physicalTable = String(selectable.find((f) => f?.physicalTable)?.physicalTable || fields.find((f) => f?.physicalTable)?.physicalTable || '');
2397
2503
  if (!physicalTable) {
2398
2504
  try {
2399
- const full = await formSource.dataSourceFields(client, formId);
2505
+ const full = await formSource.dataSourceFields(client, formId, true, sourceProtocol);
2400
2506
  const walkPhysical = (items) => {
2401
2507
  for (const item of items || []) {
2402
2508
  if (item?.physicalTable)