weaver-e10-builder 1.2.3 → 1.2.5

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 (210) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +12 -25
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/designer-css.d.ts +15 -0
  5. package/dist/commands/designer-css.d.ts.map +1 -0
  6. package/dist/commands/designer-css.js +205 -0
  7. package/dist/commands/designer-css.js.map +1 -0
  8. package/dist/commands/form-field-lang.d.ts.map +1 -1
  9. package/dist/commands/form-field-lang.js +4 -39
  10. package/dist/commands/form-field-lang.js.map +1 -1
  11. package/dist/commands/form-layout-init.d.ts.map +1 -1
  12. package/dist/commands/form-layout-init.js +15 -10
  13. package/dist/commands/form-layout-init.js.map +1 -1
  14. package/dist/commands/form-layout.js +24 -21
  15. package/dist/commands/form-layout.js.map +1 -1
  16. package/dist/commands/form-native.d.ts.map +1 -1
  17. package/dist/commands/form-native.js +181 -0
  18. package/dist/commands/form-native.js.map +1 -1
  19. package/dist/commands/form-validate.d.ts.map +1 -1
  20. package/dist/commands/form-validate.js +11 -3
  21. package/dist/commands/form-validate.js.map +1 -1
  22. package/dist/commands/form.d.ts.map +1 -1
  23. package/dist/commands/form.js +76 -19
  24. package/dist/commands/form.js.map +1 -1
  25. package/dist/commands/menu.d.ts.map +1 -1
  26. package/dist/commands/menu.js +170 -23
  27. package/dist/commands/menu.js.map +1 -1
  28. package/dist/commands/wf-form.d.ts +1 -0
  29. package/dist/commands/wf-form.d.ts.map +1 -1
  30. package/dist/commands/wf-form.js +44 -13
  31. package/dist/commands/wf-form.js.map +1 -1
  32. package/dist/commands/workflow-node-assign-flow.d.ts.map +1 -1
  33. package/dist/commands/workflow-node-assign-flow.js +1 -2
  34. package/dist/commands/workflow-node-assign-flow.js.map +1 -1
  35. package/dist/commands/workflow-node.d.ts.map +1 -1
  36. package/dist/commands/workflow-node.js +147 -2
  37. package/dist/commands/workflow-node.js.map +1 -1
  38. package/dist/commands/workflow-odoc.d.ts.map +1 -1
  39. package/dist/commands/workflow-odoc.js +56 -56
  40. package/dist/commands/workflow-odoc.js.map +1 -1
  41. package/dist/commands/workflow-setting.d.ts.map +1 -1
  42. package/dist/commands/workflow-setting.js +77 -1
  43. package/dist/commands/workflow-setting.js.map +1 -1
  44. package/dist/commands/workflow.d.ts.map +1 -1
  45. package/dist/commands/workflow.js +36 -80
  46. package/dist/commands/workflow.js.map +1 -1
  47. package/dist/core/client.d.ts +14 -0
  48. package/dist/core/client.d.ts.map +1 -1
  49. package/dist/core/client.js +28 -12
  50. package/dist/core/client.js.map +1 -1
  51. package/dist/index.js +2 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/services/actionflow/command_output.d.ts +7 -0
  54. package/dist/services/actionflow/command_output.d.ts.map +1 -1
  55. package/dist/services/actionflow/command_output.js +46 -0
  56. package/dist/services/actionflow/command_output.js.map +1 -1
  57. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/action_eb_add.js +14 -4
  59. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  60. package/dist/services/actionflow/components/action_eb_add_compiler.d.ts.map +1 -1
  61. package/dist/services/actionflow/components/action_eb_add_compiler.js +29 -0
  62. package/dist/services/actionflow/components/action_eb_add_compiler.js.map +1 -1
  63. package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_update.js +23 -8
  65. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  66. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  67. package/dist/services/actionflow/components/action_eb_update_compiler.js +239 -6
  68. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  69. package/dist/services/actionflow/components/custom_set_form.d.ts +10 -0
  70. package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -0
  71. package/dist/services/actionflow/components/custom_set_form.js +65 -0
  72. package/dist/services/actionflow/components/custom_set_form.js.map +1 -0
  73. package/dist/services/actionflow/components/custom_trigger.d.ts +2 -2
  74. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
  75. package/dist/services/actionflow/components/custom_trigger.js +7 -10
  76. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  77. package/dist/services/actionflow/components/enquiry_form.js +1 -1
  78. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  79. package/dist/services/actionflow/components/output.d.ts.map +1 -1
  80. package/dist/services/actionflow/components/output.js +6 -1
  81. package/dist/services/actionflow/components/output.js.map +1 -1
  82. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  83. package/dist/services/actionflow/context_preflight.js +13 -6
  84. package/dist/services/actionflow/context_preflight.js.map +1 -1
  85. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  86. package/dist/services/actionflow/context_provider.js +3 -2
  87. package/dist/services/actionflow/context_provider.js.map +1 -1
  88. package/dist/services/actionflow/dynamic_resources.d.ts.map +1 -1
  89. package/dist/services/actionflow/dynamic_resources.js +1 -1
  90. package/dist/services/actionflow/dynamic_resources.js.map +1 -1
  91. package/dist/services/actionflow/ebuilder_source.d.ts +19 -0
  92. package/dist/services/actionflow/ebuilder_source.d.ts.map +1 -0
  93. package/dist/services/actionflow/ebuilder_source.js +78 -0
  94. package/dist/services/actionflow/ebuilder_source.js.map +1 -0
  95. package/dist/services/actionflow/form_source.d.ts +51 -10
  96. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  97. package/dist/services/actionflow/form_source.js +173 -29
  98. package/dist/services/actionflow/form_source.js.map +1 -1
  99. package/dist/services/actionflow/formula_service.d.ts +4 -1
  100. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  101. package/dist/services/actionflow/formula_service.js +46 -22
  102. package/dist/services/actionflow/formula_service.js.map +1 -1
  103. package/dist/services/actionflow/preflight_service.d.ts +6 -0
  104. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  105. package/dist/services/actionflow/preflight_service.js +211 -3
  106. package/dist/services/actionflow/preflight_service.js.map +1 -1
  107. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  108. package/dist/services/actionflow/workflow_compiler.js +83 -15
  109. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  110. package/dist/services/designer-css.d.ts +89 -0
  111. package/dist/services/designer-css.d.ts.map +1 -0
  112. package/dist/services/designer-css.js +163 -0
  113. package/dist/services/designer-css.js.map +1 -0
  114. package/dist/services/dom-structure.d.ts +42 -0
  115. package/dist/services/dom-structure.d.ts.map +1 -0
  116. package/dist/services/dom-structure.js +251 -0
  117. package/dist/services/dom-structure.js.map +1 -0
  118. package/dist/services/form-field-patch.d.ts +22 -0
  119. package/dist/services/form-field-patch.d.ts.map +1 -1
  120. package/dist/services/form-field-patch.js +29 -0
  121. package/dist/services/form-field-patch.js.map +1 -1
  122. package/dist/services/form-i18n-label.d.ts +48 -0
  123. package/dist/services/form-i18n-label.d.ts.map +1 -0
  124. package/dist/services/form-i18n-label.js +91 -0
  125. package/dist/services/form-i18n-label.js.map +1 -0
  126. package/dist/services/form-style-template.d.ts +6 -2
  127. package/dist/services/form-style-template.d.ts.map +1 -1
  128. package/dist/services/form-style-template.js +8 -4
  129. package/dist/services/form-style-template.js.map +1 -1
  130. package/dist/services/menu-catalog.d.ts +84 -0
  131. package/dist/services/menu-catalog.d.ts.map +1 -0
  132. package/dist/services/menu-catalog.js +183 -0
  133. package/dist/services/menu-catalog.js.map +1 -0
  134. package/dist/services/workflow-add-step.d.ts +45 -0
  135. package/dist/services/workflow-add-step.d.ts.map +1 -0
  136. package/dist/services/workflow-add-step.js +122 -0
  137. package/dist/services/workflow-add-step.js.map +1 -0
  138. package/dist/services/workflow-assign-flow.d.ts +1 -6
  139. package/dist/services/workflow-assign-flow.d.ts.map +1 -1
  140. package/dist/services/workflow-assign-flow.js +3 -8
  141. package/dist/services/workflow-assign-flow.js.map +1 -1
  142. package/dist/services/workflow-drawback.d.ts +19 -0
  143. package/dist/services/workflow-drawback.d.ts.map +1 -0
  144. package/dist/services/workflow-drawback.js +59 -0
  145. package/dist/services/workflow-drawback.js.map +1 -0
  146. package/dist/services/workflow-links.d.ts +51 -0
  147. package/dist/services/workflow-links.d.ts.map +1 -0
  148. package/dist/services/workflow-links.js +162 -0
  149. package/dist/services/workflow-links.js.map +1 -0
  150. package/dist/services/workflow-node-layout.d.ts +45 -4
  151. package/dist/services/workflow-node-layout.d.ts.map +1 -1
  152. package/dist/services/workflow-node-layout.js +142 -41
  153. package/dist/services/workflow-node-layout.js.map +1 -1
  154. package/dist/services/workflow-odoc-setting.d.ts +43 -0
  155. package/dist/services/workflow-odoc-setting.d.ts.map +1 -0
  156. package/dist/services/workflow-odoc-setting.js +100 -0
  157. package/dist/services/workflow-odoc-setting.js.map +1 -0
  158. package/dist/services/workflow-tab-config.d.ts +54 -0
  159. package/dist/services/workflow-tab-config.d.ts.map +1 -0
  160. package/dist/services/workflow-tab-config.js +137 -0
  161. package/dist/services/workflow-tab-config.js.map +1 -0
  162. package/dist/types.d.ts +5 -1
  163. package/dist/types.d.ts.map +1 -1
  164. package/package.json +48 -48
  165. package/skill-docs/SKILL.md +7 -7
  166. package/skill-docs/_catalog.md +2 -0
  167. package/skill-docs/actionflows/SKILL.md +2 -0
  168. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +38 -1
  169. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +42 -0
  170. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +1 -1
  171. package/skill-docs/actionflows/references/components/logic/Output.md +2 -0
  172. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +16 -11
  173. package/skill-docs/assets/dom-structure/Bar.json +341 -0
  174. package/skill-docs/assets/dom-structure/BarStack.json +341 -0
  175. package/skill-docs/assets/dom-structure/Bubble.json +323 -0
  176. package/skill-docs/assets/dom-structure/Calendar.json +515 -0
  177. package/skill-docs/assets/dom-structure/Circular.json +337 -0
  178. package/skill-docs/assets/dom-structure/CollapsePanel.json +289 -0
  179. package/skill-docs/assets/dom-structure/Comment.json +617 -0
  180. package/skill-docs/assets/dom-structure/CountDown.json +755 -0
  181. package/skill-docs/assets/dom-structure/DigitalPanel.json +191 -0
  182. package/skill-docs/assets/dom-structure/EbButton.json +387 -0
  183. package/skill-docs/assets/dom-structure/FastCreate.json +242 -0
  184. package/skill-docs/assets/dom-structure/Gauge.json +282 -0
  185. package/skill-docs/assets/dom-structure/HBar.json +336 -0
  186. package/skill-docs/assets/dom-structure/HBarStack.json +337 -0
  187. package/skill-docs/assets/dom-structure/Line.json +341 -0
  188. package/skill-docs/assets/dom-structure/NList.json +712 -0
  189. package/skill-docs/assets/dom-structure/NavBar.json +274 -0
  190. package/skill-docs/assets/dom-structure/NavPanel.json +390 -0
  191. package/skill-docs/assets/dom-structure/NewTab.json +606 -0
  192. package/skill-docs/assets/dom-structure/Nightingale.json +336 -0
  193. package/skill-docs/assets/dom-structure/PageHeader.json +205 -0
  194. package/skill-docs/assets/dom-structure/Picture.json +209 -0
  195. package/skill-docs/assets/dom-structure/Pie.json +338 -0
  196. package/skill-docs/assets/dom-structure/ProgressChart.json +299 -0
  197. package/skill-docs/assets/dom-structure/SearchGlobal.json +628 -0
  198. package/skill-docs/assets/dom-structure/Slide.json +489 -0
  199. package/skill-docs/assets/dom-structure/Treemap.json +324 -0
  200. package/skill-docs/references/common/guide-plan-template.md +1 -1
  201. package/skill-docs/references/common/ref-cli-commands.md +21 -13
  202. package/skill-docs/references/ebuilder-designer/guide-designer-components.md +12 -1
  203. package/skill-docs/references/ebuilder-designer/guide-designer-css.md +127 -0
  204. package/skill-docs/references/ebuilder-designer/guide-designer.md +6 -5
  205. package/skill-docs/references/form/guide-create-form.md +1 -1
  206. package/skill-docs/references/form/guide-form-layout-planning.md +1 -1
  207. package/skill-docs/references/form/guide-form-linkage.md +28 -2
  208. package/skill-docs/references/menu/system-menus.md +12 -0
  209. package/skill-docs/references/workflow/guide-workflow-odoc.md +22 -2
  210. package/skill-docs/references/workflow/guide-workflow.md +18 -3
@@ -3,8 +3,9 @@ import * as workflowSource from './workflow_source.js';
3
3
  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
+ import { completeEbuilder, pickEbuilderBrowserRow } from './ebuilder_source.js';
6
7
  import { resolveHttpBindings } from './http_source.js';
7
- import { registerTargetFormFields, registerTargetDetailFields, registerWorkflowFieldIds, registerWorkflowContextFields, getWorkflowFieldIds, getWorkflowDetailFields, getWorkflowDetailNames, getTargetFormFields, } from './runtime_metadata.js';
8
+ import { registerTargetFormFields, registerTargetDetailFields, registerWorkflowFieldIds, registerWorkflowContextFields, getWorkflowFieldIds, getWorkflowDetailFields, getWorkflowDetailNames, getTargetFormFields, getTargetDetailFields, } from './runtime_metadata.js';
8
9
  // workflow_id → 目标表单 id(进程缓存)
9
10
  const FORM_ID_CACHE = {};
10
11
  import { ContextStore, PlatformContextProvider } from './context_provider.js';
@@ -522,6 +523,128 @@ export async function resolveFixedPeople(plan, client) {
522
523
  (plan._autoResources ??= []).push(...records);
523
524
  return records;
524
525
  }
526
+ function isDynamicAssignment(value) {
527
+ const kind = String(value?.kind ?? value?.assignmentKind ?? '').toLowerCase();
528
+ return ['context', 'reference', 'system_variable', 'variable', 'constant', 'function', 'formula', 'query_result', 'transform'].includes(kind);
529
+ }
530
+ function isEbuilderField(field) {
531
+ return String(field?.componentKey || field?.fieldConfig?.componentKey || '').toLowerCase() === 'ebuilder';
532
+ }
533
+ /** 从固定值中取出需要送给 Browser 搜索的名称。 */
534
+ function fixedBrowserSearchValue(value) {
535
+ if (isDynamicAssignment(value))
536
+ return null;
537
+ const outer = value && typeof value === 'object' && value.kind === 'fixed' ? value.value : value;
538
+ const raw = outer && typeof outer === 'object' && 'value' in outer && !('id' in outer)
539
+ ? outer.value : outer;
540
+ if (raw && typeof raw === 'object') {
541
+ const id = raw.id ?? raw.value ?? raw.dataId ?? raw.objId;
542
+ const name = raw.name ?? raw.showName ?? raw.content ?? raw.text ?? raw.label;
543
+ if (id != null)
544
+ return { name: String(name || ''), hasId: true };
545
+ return name ? { name: String(name), hasId: false } : null;
546
+ }
547
+ if (raw == null || String(raw).trim() === '')
548
+ return null;
549
+ return { name: String(raw).trim(), hasId: false };
550
+ }
551
+ /**
552
+ * e-builder 关联字段的固定值必须是 Browser 对象,而不是名称字符串。
553
+ * 设计器按名称输入时,先通过当前表单/字段的 complete 接口补齐真实 id 和显示名,
554
+ * 再交给通用公式编译器生成 fixvalue。
555
+ */
556
+ export async function resolveEbuilderFixedValues(plan, client) {
557
+ const records = [];
558
+ const requestCache = new Map();
559
+ const resolveValue = async (container, key, field, formId, rawValue, path, detailFields) => {
560
+ if (!isEbuilderField(field) || isDynamicAssignment(rawValue))
561
+ return;
562
+ const targetField = detailFields?.[String(key)] || field;
563
+ if (!isEbuilderField(targetField))
564
+ return;
565
+ const search = fixedBrowserSearchValue(rawValue);
566
+ if (!search || search.hasId)
567
+ return;
568
+ const fieldId = String(targetField.id || key);
569
+ const cacheKey = `${formId}:${fieldId}:${search.name}`;
570
+ let browser = requestCache.get(cacheKey);
571
+ if (!browser) {
572
+ const rows = await completeEbuilder(client, { objId: formId, fieldId, searchValue: search.name });
573
+ browser = pickEbuilderBrowserRow(rows, search.name);
574
+ requestCache.set(cacheKey, browser);
575
+ }
576
+ if (rawValue && typeof rawValue === 'object' && rawValue.kind === 'fixed') {
577
+ rawValue.value = browser;
578
+ }
579
+ else if (rawValue && typeof rawValue === 'object' && 'value' in rawValue && !('id' in rawValue)) {
580
+ rawValue.value = browser;
581
+ rawValue.label = browser.name;
582
+ }
583
+ else if (rawValue && typeof rawValue === 'object') {
584
+ container[key] = browser;
585
+ }
586
+ else {
587
+ container[key] = { kind: 'fixed', value: browser };
588
+ }
589
+ records.push({ path, resourceType: 'ebuilder_browser', value: { id: browser.id, name: browser.name }, reason: 'Ebuilder 关联字段固定值已通过当前字段 Browser 接口补全真实 id 和显示名' });
590
+ };
591
+ const walk = async (steps) => {
592
+ for (const step of steps || []) {
593
+ if (!step || typeof step !== 'object')
594
+ continue;
595
+ const params = step.params || {};
596
+ const form = stepFormRef(step);
597
+ const formId = String(form?.id || '');
598
+ const fields = formId ? getTargetFormFields()[formId] || {} : {};
599
+ if (formId && params && typeof params === 'object') {
600
+ const constants = params.constants;
601
+ if (constants && typeof constants === 'object' && !Array.isArray(constants)) {
602
+ for (const [fieldId, value] of Object.entries(constants)) {
603
+ const normalizedId = String(fieldId).replace(/^[+-]/, '');
604
+ await resolveValue(constants, fieldId, fields[normalizedId], formId, value, `${step.type}.params.constants.${fieldId}`);
605
+ }
606
+ }
607
+ // ActionEbAdd/Update 的旧格式 setting/updates 也会进入同一个固定值编译器。
608
+ // 在归一化成 FormulaBean 之前补全,避免旧格式绕过 Ebuilder Browser 查询。
609
+ for (const assignmentKey of ['setting', 'updates']) {
610
+ const assignments = params[assignmentKey];
611
+ if (!Array.isArray(assignments))
612
+ continue;
613
+ for (const [index, item] of assignments.entries()) {
614
+ if (!item || typeof item !== 'object' || item.value === undefined)
615
+ continue;
616
+ const fieldRef = item.field ?? item.formField ?? item.fieldId;
617
+ const fieldId = String(fieldRef && typeof fieldRef === 'object'
618
+ ? (fieldRef.id ?? fieldRef.key ?? '') : (fieldRef ?? ''));
619
+ const field = fieldRef && typeof fieldRef === 'object' && fieldRef.componentKey
620
+ ? fieldRef : fields[fieldId];
621
+ await resolveValue(item, 'value', field, formId, item.value, `${step.type}.params.${assignmentKey}[${index}].value`);
622
+ }
623
+ }
624
+ for (const item of Array.isArray(params.detail) ? params.detail : []) {
625
+ if (!item || typeof item !== 'object')
626
+ continue;
627
+ const detailTableId = String(item.detailTableId || item.tableId || item.table || '');
628
+ const detailFields = getTargetDetailFields()[formId]?.[detailTableId] || {};
629
+ const detailConstants = item.constants;
630
+ if (detailConstants && typeof detailConstants === 'object' && !Array.isArray(detailConstants)) {
631
+ for (const [fieldId, value] of Object.entries(detailConstants)) {
632
+ await resolveValue(detailConstants, fieldId, fields[String(fieldId)] || detailFields[String(fieldId)], formId, value, `${step.type}.params.detail[${detailTableId}].constants.${fieldId}`, detailFields);
633
+ }
634
+ }
635
+ }
636
+ }
637
+ for (const branch of getStepBranches(step) || [])
638
+ await walk(branch?.actions || []);
639
+ if (Array.isArray(step.actions))
640
+ await walk(step.actions);
641
+ }
642
+ };
643
+ await walk(plan.actions || []);
644
+ if (records.length)
645
+ (plan._autoResources ??= []).push(...records);
646
+ return records;
647
+ }
525
648
  /** 委托流程的两张设置表在每个租户都有独立字段 ID,生成前必须实时读取。 */
526
649
  export async function resolveEntrustFields(plan, client, errors) {
527
650
  for (const step of walkPlanSteps(plan.actions || [])) {
@@ -703,6 +826,28 @@ export function checkSourceReferences(plan, eventContextFields, errors, availabl
703
826
  }
704
827
  }
705
828
  };
829
+ const checkReference = (value, where) => {
830
+ if (Array.isArray(value)) {
831
+ for (const [index, item] of value.entries())
832
+ checkReference(item, `${where}[${index}]`);
833
+ return;
834
+ }
835
+ if (!value || typeof value !== 'object')
836
+ return;
837
+ const kind = String(value.kind || value.assignmentKind || '').toLowerCase();
838
+ if (kind === 'query_result')
839
+ return;
840
+ if (kind === 'context' || kind === 'reference') {
841
+ checkSourceKey(String(value.paramKey || value.key || value.fieldKey || ''), where);
842
+ return;
843
+ }
844
+ if (value.assign)
845
+ checkReference(value.assign, `${where}.assign`);
846
+ if (Array.isArray(value.args))
847
+ checkReference(value.args, `${where}.args`);
848
+ if (Array.isArray(value.fields))
849
+ checkReference(value.fields, `${where}.fields`);
850
+ };
706
851
  const walk = (steps, prefix = 'actions') => {
707
852
  for (const [idx, step] of (steps || []).entries()) {
708
853
  if (!step || typeof step !== 'object')
@@ -734,8 +879,14 @@ export function checkSourceReferences(plan, eventContextFields, errors, availabl
734
879
  }
735
880
  }
736
881
  for (const [di, det] of (params.detail || []).entries()) {
737
- if (det && typeof det === 'object')
882
+ if (det && typeof det === 'object') {
738
883
  checkMapping(det.mapping, `${path}.detail[${di}].mapping`);
884
+ checkReference(det.basisValue, `${path}.detail[${di}].basisValue`);
885
+ checkReference(det.rowId, `${path}.detail[${di}].rowId`);
886
+ for (const [ci, condition] of (det.updateFieldCondition?.updateField || []).entries()) {
887
+ checkReference(condition?.assign ?? condition?.value, `${path}.detail[${di}].updateFieldCondition.updateField[${ci}]`);
888
+ }
889
+ }
739
890
  }
740
891
  }
741
892
  }
@@ -1193,6 +1344,41 @@ export function normalizeShowDataSourceFields(response, formId) {
1193
1344
  visit(root);
1194
1345
  return fields;
1195
1346
  }
1347
+ /**
1348
+ * 归一化 /api/ebuilder/common/ds/fields 的字段对象。
1349
+ *
1350
+ * EnquiryForm 的 filterInput 左值必须使用数据源字段选择器返回的实时元数据;
1351
+ * getEbField 只适合表单字段校验,部分租户不会带齐 componentKey、formInfo、
1352
+ * sformId 和物理字段信息。这里只补齐编译器读取的别名,不改变平台原对象。
1353
+ */
1354
+ function normalizeDataSourceField(field, formId) {
1355
+ if (!field || typeof field !== 'object')
1356
+ return field;
1357
+ let config = field.config;
1358
+ if (typeof config === 'string') {
1359
+ try {
1360
+ config = JSON.parse(config);
1361
+ }
1362
+ catch {
1363
+ config = {};
1364
+ }
1365
+ }
1366
+ if (!config || typeof config !== 'object')
1367
+ config = {};
1368
+ const formInfo = field.formInfo && typeof field.formInfo === 'object' ? field.formInfo : {};
1369
+ const id = String(field.id || '');
1370
+ return {
1371
+ ...field,
1372
+ id,
1373
+ showName: String(field.showName || field.text || field.name || field.content || id),
1374
+ name: String(field.name || (id && /^\d+$/.test(id) ? `field_${id}` : field.text || id)),
1375
+ componentKey: String(field.componentKey || config.componentKey || field.compType || field.type || ''),
1376
+ paramType: String(field.paramType || field.type || config.type || 'string').toLowerCase(),
1377
+ type: String(field.type || field.paramType || config.type || 'String'),
1378
+ formId: String(field.formId || formInfo.formId || formId),
1379
+ ...(field.layoutId || formInfo.layoutId ? { layoutId: String(field.layoutId || formInfo.layoutId) } : {}),
1380
+ };
1381
+ }
1196
1382
  export function syncEventResourcesToDraft(draft, plan) {
1197
1383
  const pe = plan.event, de = draft.event;
1198
1384
  if (!pe || !de || typeof pe !== 'object' || typeof de !== 'object')
@@ -1419,7 +1605,23 @@ export async function preflightContext(plan, appId, client) {
1419
1605
  // “默认全选”必须在计划层固化为实时字段列表。仅在编译期依赖全局缓存时,
1420
1606
  // 查询组件偶尔会只保留系统字段,筛选编辑器因此把业务字段标成“已删除”。
1421
1607
  const params = step.params && typeof step.params === 'object' ? step.params : (step.params = {});
1422
- if (['EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type)) {
1608
+ if (['EnquiryForm', 'TimeBatchTrigger', 'DateTrigger'].includes(step.type)
1609
+ || (step.type === 'ActionEbUpdate' && ['updateData', 'fieldUpdate'].includes(String(params.opType || 'updateData')))) {
1610
+ // EnquiryForm/条件更新的筛选条件左值必须来自数据源字段选择器,
1611
+ // 而不是只用 getEbField 的表单字段对象。后者经常缺少数据源侧的
1612
+ // name/formInfo/sformId,会导致设计器把条件字段显示为“已删除”
1613
+ // 或保存时静默丢弃。
1614
+ try {
1615
+ const dataSourceResponse = await formSource.dataSourceFields(client, formId, true);
1616
+ const dataSourceFields = normalizeShowDataSourceFields(dataSourceResponse, formId)
1617
+ .map((field) => normalizeDataSourceField(field, formId))
1618
+ .filter((field) => Boolean(field?.id));
1619
+ if (dataSourceFields.length)
1620
+ registerTargetFormFields(formId, dataSourceFields);
1621
+ }
1622
+ catch {
1623
+ // 保留下方 showDataSourceFields/getEbField 降级;最终保存仍由平台校验。
1624
+ }
1423
1625
  // getEbField 用于类型/筛选校验;queryFields 必须采用设计器字段选择器
1424
1626
  // showDataSourceFields 返回的对象和字段 ID(业务字段通常是 field_<真实ID>),
1425
1627
  // 否则后端会静默丢弃业务字段。
@@ -1505,6 +1707,12 @@ export async function preflightContext(plan, appId, client) {
1505
1707
  };
1506
1708
  await hydrateFilterFields([event]);
1507
1709
  await hydrateFilterFields(plan.actions || []);
1710
+ try {
1711
+ await resolveEbuilderFixedValues(plan, client);
1712
+ }
1713
+ catch (error) {
1714
+ errors.push(`Ebuilder 固定值补全失败: ${String(error?.message || error)}`);
1715
+ }
1508
1716
  // 更新动作若无法拿到目标表字段,平台 saveDesign 会直接 500,这里硬拦截。
1509
1717
  const validateUpdateFields = (steps, prefix = 'actions') => {
1510
1718
  for (const [index, step] of (steps || []).entries()) {