weaver-e10-builder 1.5.13 → 1.5.15
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.
- package/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +1 -0
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/designer-setters.d.ts.map +1 -1
- package/dist/commands/designer-setters.js +148 -47
- package/dist/commands/designer-setters.js.map +1 -1
- package/dist/commands/form-add-detail-table.d.ts.map +1 -1
- package/dist/commands/form-add-detail-table.js +53 -7
- package/dist/commands/form-add-detail-table.js.map +1 -1
- package/dist/commands/form-browser-definition.d.ts +14 -0
- package/dist/commands/form-browser-definition.d.ts.map +1 -0
- package/dist/commands/form-browser-definition.js +493 -0
- package/dist/commands/form-browser-definition.js.map +1 -0
- package/dist/commands/form-code.d.ts +5 -0
- package/dist/commands/form-code.d.ts.map +1 -0
- package/dist/commands/form-code.js +276 -0
- package/dist/commands/form-code.js.map +1 -0
- package/dist/commands/form-engine-linkage.d.ts +3 -0
- package/dist/commands/form-engine-linkage.d.ts.map +1 -0
- package/dist/commands/form-engine-linkage.js +199 -0
- package/dist/commands/form-engine-linkage.js.map +1 -0
- package/dist/commands/form-formula.d.ts.map +1 -1
- package/dist/commands/form-formula.js +7 -19
- package/dist/commands/form-formula.js.map +1 -1
- package/dist/commands/form-layout-template-advanced.d.ts +3 -0
- package/dist/commands/form-layout-template-advanced.d.ts.map +1 -0
- package/dist/commands/form-layout-template-advanced.js +115 -0
- package/dist/commands/form-layout-template-advanced.js.map +1 -0
- package/dist/commands/form-layout-template-easy.d.ts +3 -0
- package/dist/commands/form-layout-template-easy.d.ts.map +1 -0
- package/dist/commands/form-layout-template-easy.js +59 -0
- package/dist/commands/form-layout-template-easy.js.map +1 -0
- package/dist/commands/form-layout.d.ts.map +1 -1
- package/dist/commands/form-layout.js +77 -0
- package/dist/commands/form-layout.js.map +1 -1
- package/dist/commands/form-list-filter.js +1 -1
- package/dist/commands/form-list-filter.js.map +1 -1
- package/dist/commands/form-list-utils.d.ts +5 -0
- package/dist/commands/form-list-utils.d.ts.map +1 -1
- package/dist/commands/form-list-utils.js +23 -3
- package/dist/commands/form-list-utils.js.map +1 -1
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +55 -19
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/form-physical-table.d.ts.map +1 -1
- package/dist/commands/form-physical-table.js +8 -2
- package/dist/commands/form-physical-table.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +143 -5
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/menu.d.ts +68 -2
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +186 -41
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/page.d.ts.map +1 -1
- package/dist/commands/page.js +29 -6
- package/dist/commands/page.js.map +1 -1
- package/dist/commands/special.d.ts.map +1 -1
- package/dist/commands/special.js +3 -2
- package/dist/commands/special.js.map +1 -1
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +76 -31
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-auth-resp.js +2 -2
- package/dist/commands/workflow-auth-resp.js.map +1 -1
- package/dist/commands/workflow-base-command.d.ts +4 -0
- package/dist/commands/workflow-base-command.d.ts.map +1 -0
- package/dist/commands/workflow-base-command.js +6 -0
- package/dist/commands/workflow-base-command.js.map +1 -0
- package/dist/commands/workflow-base-settings.d.ts +3 -0
- package/dist/commands/workflow-base-settings.d.ts.map +1 -0
- package/dist/commands/workflow-base-settings.js +76 -0
- package/dist/commands/workflow-base-settings.js.map +1 -0
- package/dist/commands/workflow-condition.d.ts.map +1 -1
- package/dist/commands/workflow-condition.js +59 -450
- package/dist/commands/workflow-condition.js.map +1 -1
- package/dist/commands/workflow-export.d.ts +9 -0
- package/dist/commands/workflow-export.d.ts.map +1 -0
- package/dist/commands/workflow-export.js +121 -0
- package/dist/commands/workflow-export.js.map +1 -0
- package/dist/commands/workflow-function-settings.d.ts +3 -0
- package/dist/commands/workflow-function-settings.d.ts.map +1 -0
- package/dist/commands/workflow-function-settings.js +47 -0
- package/dist/commands/workflow-function-settings.js.map +1 -0
- package/dist/commands/workflow-node.d.ts.map +1 -1
- package/dist/commands/workflow-node.js +28 -53
- package/dist/commands/workflow-node.js.map +1 -1
- package/dist/commands/workflow-operator-batch.d.ts +3 -0
- package/dist/commands/workflow-operator-batch.d.ts.map +1 -0
- package/dist/commands/workflow-operator-batch.js +35 -0
- package/dist/commands/workflow-operator-batch.js.map +1 -0
- package/dist/commands/workflow-setting.d.ts.map +1 -1
- package/dist/commands/workflow-setting.js +137 -406
- package/dist/commands/workflow-setting.js.map +1 -1
- package/dist/commands/workflow-subprocess.d.ts.map +1 -1
- package/dist/commands/workflow-subprocess.js +21 -33
- package/dist/commands/workflow-subprocess.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +18 -33
- package/dist/commands/workflow.js.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/browser_source.d.ts +9 -0
- package/dist/services/actionflow/browser_source.d.ts.map +1 -0
- package/dist/services/actionflow/browser_source.js +12 -0
- package/dist/services/actionflow/browser_source.js.map +1 -0
- package/dist/services/actionflow/components/date_trigger.js +1 -1
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/document_actions.js +178 -25
- package/dist/services/actionflow/components/document_actions.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +1 -1
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/logic_flow_set.d.ts.map +1 -1
- package/dist/services/actionflow/components/logic_flow_set.js +80 -8
- package/dist/services/actionflow/components/logic_flow_set.js.map +1 -1
- package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/meeting_create.js +1 -0
- package/dist/services/actionflow/components/meeting_create.js.map +1 -1
- package/dist/services/actionflow/components/schedule_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/schedule_create.js +2 -0
- package/dist/services/actionflow/components/schedule_create.js.map +1 -1
- package/dist/services/actionflow/components/time_batch_trigger.js +1 -1
- package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +6 -2
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +103 -6
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/form_source.d.ts +2 -0
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +8 -0
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +35 -19
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/logicflow_source.d.ts +5 -0
- package/dist/services/actionflow/logicflow_source.d.ts.map +1 -0
- package/dist/services/actionflow/logicflow_source.js +15 -0
- package/dist/services/actionflow/logicflow_source.js.map +1 -0
- package/dist/services/actionflow/preflight_service.d.ts +15 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +558 -26
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/runtime_metadata.d.ts +8 -0
- package/dist/services/actionflow/runtime_metadata.d.ts.map +1 -1
- package/dist/services/actionflow/runtime_metadata.js +25 -0
- package/dist/services/actionflow/runtime_metadata.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +50 -10
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/actionflow/workflow_source.d.ts +2 -0
- package/dist/services/actionflow/workflow_source.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_source.js +7 -0
- package/dist/services/actionflow/workflow_source.js.map +1 -1
- package/dist/services/auth-resp-condition.d.ts +7 -3
- package/dist/services/auth-resp-condition.d.ts.map +1 -1
- package/dist/services/auth-resp-condition.js +58 -63
- package/dist/services/auth-resp-condition.js.map +1 -1
- package/dist/services/browser.d.ts +5 -0
- package/dist/services/browser.d.ts.map +1 -1
- package/dist/services/browser.js +16 -4
- package/dist/services/browser.js.map +1 -1
- package/dist/services/condition-rules.d.ts +2 -30
- package/dist/services/condition-rules.d.ts.map +1 -1
- package/dist/services/condition-rules.js +3 -219
- package/dist/services/condition-rules.js.map +1 -1
- package/dist/services/designer-dataset.d.ts +45 -0
- package/dist/services/designer-dataset.d.ts.map +1 -0
- package/dist/services/designer-dataset.js +156 -0
- package/dist/services/designer-dataset.js.map +1 -0
- package/dist/services/form-association.d.ts +7 -0
- package/dist/services/form-association.d.ts.map +1 -1
- package/dist/services/form-association.js +22 -1
- package/dist/services/form-association.js.map +1 -1
- package/dist/services/form-code.d.ts +53 -0
- package/dist/services/form-code.d.ts.map +1 -0
- package/dist/services/form-code.js +370 -0
- package/dist/services/form-code.js.map +1 -0
- package/dist/services/form-create.d.ts +20 -0
- package/dist/services/form-create.d.ts.map +1 -1
- package/dist/services/form-create.js +73 -1
- package/dist/services/form-create.js.map +1 -1
- package/dist/services/form-field-build.d.ts +1 -1
- package/dist/services/form-field-build.d.ts.map +1 -1
- package/dist/services/form-field-build.js +20 -1
- package/dist/services/form-field-build.js.map +1 -1
- package/dist/services/form-field-drop.d.ts +2 -0
- package/dist/services/form-field-drop.d.ts.map +1 -1
- package/dist/services/form-field-drop.js +2 -0
- package/dist/services/form-field-drop.js.map +1 -1
- package/dist/services/form-layout-detail-insert.d.ts +58 -0
- package/dist/services/form-layout-detail-insert.d.ts.map +1 -0
- package/dist/services/form-layout-detail-insert.js +293 -0
- package/dist/services/form-layout-detail-insert.js.map +1 -0
- package/dist/services/form-layout-insert.d.ts.map +1 -1
- package/dist/services/form-layout-insert.js +34 -2
- package/dist/services/form-layout-insert.js.map +1 -1
- package/dist/services/form-layout-source/compile.d.ts.map +1 -1
- package/dist/services/form-layout-source/compile.js +11 -4
- package/dist/services/form-layout-source/compile.js.map +1 -1
- package/dist/services/form-layout-template-advanced.d.ts +330 -0
- package/dist/services/form-layout-template-advanced.d.ts.map +1 -0
- package/dist/services/form-layout-template-advanced.js +1437 -0
- package/dist/services/form-layout-template-advanced.js.map +1 -0
- package/dist/services/form-layout-template-easy.d.ts +34 -0
- package/dist/services/form-layout-template-easy.d.ts.map +1 -0
- package/dist/services/form-layout-template-easy.js +159 -0
- package/dist/services/form-layout-template-easy.js.map +1 -0
- package/dist/services/form-layout-template-flow.d.ts +23 -0
- package/dist/services/form-layout-template-flow.d.ts.map +1 -0
- package/dist/services/form-layout-template-flow.js +99 -0
- package/dist/services/form-layout-template-flow.js.map +1 -0
- package/dist/services/form-permission-archive.d.ts +23 -1
- package/dist/services/form-permission-archive.d.ts.map +1 -1
- package/dist/services/form-permission-archive.js +54 -2
- package/dist/services/form-permission-archive.js.map +1 -1
- package/dist/services/form-physical-table.d.ts +10 -0
- package/dist/services/form-physical-table.d.ts.map +1 -1
- package/dist/services/form-physical-table.js +20 -0
- package/dist/services/form-physical-table.js.map +1 -1
- package/dist/services/form-view-linkage-functions.d.ts +19 -0
- package/dist/services/form-view-linkage-functions.d.ts.map +1 -0
- package/dist/services/form-view-linkage-functions.js +90 -0
- package/dist/services/form-view-linkage-functions.js.map +1 -0
- package/dist/services/matrix-condition.d.ts +32 -1
- package/dist/services/matrix-condition.d.ts.map +1 -1
- package/dist/services/matrix-condition.js +169 -6
- package/dist/services/matrix-condition.js.map +1 -1
- package/dist/services/menu-catalog.d.ts +24 -1
- package/dist/services/menu-catalog.d.ts.map +1 -1
- package/dist/services/menu-catalog.js +49 -2
- package/dist/services/menu-catalog.js.map +1 -1
- package/dist/services/workflow-base-settings.d.ts +117 -0
- package/dist/services/workflow-base-settings.d.ts.map +1 -0
- package/dist/services/workflow-base-settings.js +504 -0
- package/dist/services/workflow-base-settings.js.map +1 -0
- package/dist/services/workflow-condition-core.d.ts +48 -0
- package/dist/services/workflow-condition-core.d.ts.map +1 -0
- package/dist/services/workflow-condition-core.js +316 -0
- package/dist/services/workflow-condition-core.js.map +1 -0
- package/dist/services/workflow-context.d.ts +10 -0
- package/dist/services/workflow-context.d.ts.map +1 -0
- package/dist/services/workflow-context.js +15 -0
- package/dist/services/workflow-context.js.map +1 -0
- package/dist/services/workflow-export.d.ts +80 -0
- package/dist/services/workflow-export.d.ts.map +1 -0
- package/dist/services/workflow-export.js +150 -0
- package/dist/services/workflow-export.js.map +1 -0
- package/dist/services/workflow-field-permission-route.d.ts +75 -0
- package/dist/services/workflow-field-permission-route.d.ts.map +1 -0
- package/dist/services/workflow-field-permission-route.js +52 -0
- package/dist/services/workflow-field-permission-route.js.map +1 -0
- package/dist/services/workflow-field-permission.d.ts +18 -0
- package/dist/services/workflow-field-permission.d.ts.map +1 -0
- package/dist/services/workflow-field-permission.js +40 -0
- package/dist/services/workflow-field-permission.js.map +1 -0
- package/dist/services/workflow-function-settings.d.ts +31 -0
- package/dist/services/workflow-function-settings.d.ts.map +1 -0
- package/dist/services/workflow-function-settings.js +191 -0
- package/dist/services/workflow-function-settings.js.map +1 -0
- package/dist/services/workflow-node-layout.d.ts +11 -10
- package/dist/services/workflow-node-layout.d.ts.map +1 -1
- package/dist/services/workflow-node-layout.js +24 -62
- package/dist/services/workflow-node-layout.js.map +1 -1
- package/dist/services/workflow-operator-batch-condition.d.ts +23 -0
- package/dist/services/workflow-operator-batch-condition.d.ts.map +1 -0
- package/dist/services/workflow-operator-batch-condition.js +56 -0
- package/dist/services/workflow-operator-batch-condition.js.map +1 -0
- package/dist/services/workflow-sign-file-settings.d.ts +16 -0
- package/dist/services/workflow-sign-file-settings.d.ts.map +1 -0
- package/dist/services/workflow-sign-file-settings.js +80 -0
- package/dist/services/workflow-sign-file-settings.js.map +1 -0
- package/dist/services/workflow-submit-confirm.d.ts +14 -0
- package/dist/services/workflow-submit-confirm.d.ts.map +1 -0
- package/dist/services/workflow-submit-confirm.js +29 -0
- package/dist/services/workflow-submit-confirm.js.map +1 -0
- package/dist/services/workflow-tab-config.d.ts +3 -3
- package/dist/services/workflow-tab-config.d.ts.map +1 -1
- package/dist/services/workflow-tab-config.js +14 -12
- package/dist/services/workflow-tab-config.js.map +1 -1
- package/dist/services/workflow-tabs-editor.d.ts +28 -0
- package/dist/services/workflow-tabs-editor.d.ts.map +1 -0
- package/dist/services/workflow-tabs-editor.js +130 -0
- package/dist/services/workflow-tabs-editor.js.map +1 -0
- package/package.json +1 -1
- package/skill-docs/SKILL.md +155 -154
- package/skill-docs/_catalog.md +106 -97
- package/skill-docs/actionflows/references/components/document/GetDocumentInfo.md +17 -17
- package/skill-docs/actionflows/references/components/logic/LogicFlowSet.md +23 -17
- package/skill-docs/assets/form-template/style-templates-advanced-base-example.json +1420 -0
- package/skill-docs/assets/form-template/style-templates-advanced-base.css +33 -0
- package/skill-docs/assets/form-template/style-templates-advanced-blue-crystal-example.json +1094 -0
- package/skill-docs/assets/form-template/style-templates-advanced-document-example.json +1251 -0
- package/skill-docs/assets/form-template/style-templates-advanced-grid-example.json +39 -0
- package/skill-docs/assets/form-template/style-templates-advanced-page-example.json +38 -0
- package/skill-docs/assets/form-template/style-templates-advanced-placements-example.json +30 -0
- package/skill-docs/assets/form-template/style-templates-advanced-standard-example.json +53 -0
- package/skill-docs/assets/form-template/style-templates-advanced-structure-example.json +25 -0
- package/skill-docs/assets/form-template/style-templates-advanced-table-example.json +1420 -0
- package/skill-docs/references/code-block/guide-code-block.md +141 -0
- package/skill-docs/references/code-block/guide-layout-css.md +107 -0
- package/skill-docs/references/code-block/ref-controls.md +60 -0
- package/skill-docs/references/code-block/ref-coverage.md +32 -0
- package/skill-docs/references/code-block/ref-details.md +57 -0
- package/skill-docs/references/code-block/ref-events-validation.md +42 -0
- package/skill-docs/references/code-block/ref-foundations-fields.md +56 -0
- package/skill-docs/references/code-block/ref-recipes.md +164 -0
- package/skill-docs/references/code-block/ref-troubleshooting.md +49 -0
- package/skill-docs/references/code-block/ref-ui-global.md +47 -0
- package/skill-docs/references/common/guide-plan-template.md +168 -167
- package/skill-docs/references/common/map.md +2 -1
- package/skill-docs/references/common/ref-cli-commands.md +67 -22
- package/skill-docs/references/ebuilder-designer/guide-designer-factory.md +8 -4
- package/skill-docs/references/form/form-template/style-templates-advanced-css-guide.md +167 -0
- package/skill-docs/references/form/form-template/style-templates-advanced.md +315 -0
- package/skill-docs/references/form/form-template/style-templates-easy.md +55 -0
- package/skill-docs/references/form/form-template/style-templates-flow.md +27 -0
- package/skill-docs/references/form/form-template/style-templates.md +29 -0
- package/skill-docs/references/form/guide-browser-definition.md +148 -0
- package/skill-docs/references/form/guide-create-form.md +258 -250
- package/skill-docs/references/form/guide-form-archive-permission.md +29 -6
- package/skill-docs/references/form/guide-form-formula-functions.md +354 -354
- package/skill-docs/references/form/guide-form-layout-incremental.md +28 -0
- package/skill-docs/references/form/guide-form-layout-planning.md +11 -0
- package/skill-docs/references/form/guide-form-layout-source.md +4 -0
- package/skill-docs/references/form/guide-form-linkage.md +295 -259
- package/skill-docs/references/form/guide-form-physical-table.md +2 -0
- package/skill-docs/references/form/guide-form-view.md +3 -0
- package/skill-docs/references/form/ref-form-fields.md +301 -293
- package/skill-docs/references/form/ref-list-filter-date-params.md +83 -0
- package/skill-docs/references/menu/system-menus.md +12 -0
- package/skill-docs/references/workflow/condition-core-contract.md +63 -0
- package/skill-docs/references/workflow/guide-base-auth-share-remind.md +126 -0
- package/skill-docs/references/workflow/guide-function-settings.md +55 -0
- package/skill-docs/references/workflow/guide-workflow-condition.md +476 -447
- package/skill-docs/references/workflow/guide-workflow-node-layout.md +6 -0
- package/skill-docs/references/workflow/guide-workflow.md +630 -527
- package/skill-docs/references/form/style-templates.md +0 -97
|
@@ -4,9 +4,11 @@ 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';
|
|
@@ -15,6 +17,7 @@ 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
|
-
|
|
480
|
-
if (!personKeys.
|
|
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
|
|
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
|
|
514
|
+
if (!values.length)
|
|
503
515
|
continue;
|
|
504
516
|
const resolved = [];
|
|
505
517
|
for (const item of values) {
|
|
506
|
-
const
|
|
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
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
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
|
-
|
|
614
|
-
|
|
615
|
-
|
|
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
|
|
1837
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
2341
|
+
}
|
|
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
|
+
}
|
|
1857
2380
|
}
|
|
1858
|
-
//
|
|
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
|
-
//
|
|
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 || '表单数据');
|
|
@@ -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) {
|