weaver-e10-builder 1.5.10 → 1.5.12
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/README.md +212 -189
- package/assets/image-style-observation.schema.json +1355 -0
- package/assets/layout-spec.schema.json +52 -0
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +159 -8
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/designer-setters.d.ts.map +1 -1
- package/dist/commands/designer-setters.js +26 -4
- package/dist/commands/designer-setters.js.map +1 -1
- package/dist/commands/form-association-manage.d.ts.map +1 -1
- package/dist/commands/form-association-manage.js +3 -0
- package/dist/commands/form-association-manage.js.map +1 -1
- package/dist/commands/form-button-actions-cmd.d.ts +3 -0
- package/dist/commands/form-button-actions-cmd.d.ts.map +1 -0
- package/dist/commands/form-button-actions-cmd.js +309 -0
- package/dist/commands/form-button-actions-cmd.js.map +1 -0
- package/dist/commands/form-button-permission-cmd.d.ts +3 -0
- package/dist/commands/form-button-permission-cmd.d.ts.map +1 -0
- package/dist/commands/form-button-permission-cmd.js +132 -0
- package/dist/commands/form-button-permission-cmd.js.map +1 -0
- package/dist/commands/form-button-props-cmd.d.ts +3 -0
- package/dist/commands/form-button-props-cmd.d.ts.map +1 -0
- package/dist/commands/form-button-props-cmd.js +236 -0
- package/dist/commands/form-button-props-cmd.js.map +1 -0
- package/dist/commands/form-button.d.ts.map +1 -1
- package/dist/commands/form-button.js +82 -55
- package/dist/commands/form-button.js.map +1 -1
- package/dist/commands/form-field-linkage.d.ts +55 -0
- package/dist/commands/form-field-linkage.d.ts.map +1 -1
- package/dist/commands/form-field-linkage.js +1026 -12
- package/dist/commands/form-field-linkage.js.map +1 -1
- package/dist/commands/form-formula-linkage.d.ts +36 -0
- package/dist/commands/form-formula-linkage.d.ts.map +1 -1
- package/dist/commands/form-formula-linkage.js +256 -65
- package/dist/commands/form-formula-linkage.js.map +1 -1
- package/dist/commands/form-layout-restore.d.ts +3 -0
- package/dist/commands/form-layout-restore.d.ts.map +1 -0
- package/dist/commands/form-layout-restore.js +217 -0
- package/dist/commands/form-layout-restore.js.map +1 -0
- package/dist/commands/form-layout.d.ts.map +1 -1
- package/dist/commands/form-layout.js +11 -1
- package/dist/commands/form-layout.js.map +1 -1
- package/dist/commands/form-list-permission.d.ts.map +1 -1
- package/dist/commands/form-list-permission.js +29 -3
- package/dist/commands/form-list-permission.js.map +1 -1
- package/dist/commands/form-list-search-group.d.ts.map +1 -1
- package/dist/commands/form-list-search-group.js +66 -3
- package/dist/commands/form-list-search-group.js.map +1 -1
- package/dist/commands/form-list-utils.d.ts +14 -0
- package/dist/commands/form-list-utils.d.ts.map +1 -1
- package/dist/commands/form-list-utils.js +65 -4
- package/dist/commands/form-list-utils.js.map +1 -1
- package/dist/commands/form-message.d.ts.map +1 -1
- package/dist/commands/form-message.js +16 -4
- package/dist/commands/form-message.js.map +1 -1
- package/dist/commands/form-obj-meta.d.ts +12 -0
- package/dist/commands/form-obj-meta.d.ts.map +1 -0
- package/dist/commands/form-obj-meta.js +116 -0
- package/dist/commands/form-obj-meta.js.map +1 -0
- package/dist/commands/form-permission.d.ts +20 -0
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +69 -11
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/form-validate.d.ts.map +1 -1
- package/dist/commands/form-validate.js +167 -35
- package/dist/commands/form-validate.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +26 -2
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/menu-permission.d.ts.map +1 -1
- package/dist/commands/menu-permission.js +6 -7
- package/dist/commands/menu-permission.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +68 -43
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +269 -47
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-function-management.d.ts +5 -0
- package/dist/commands/workflow-function-management.d.ts.map +1 -0
- package/dist/commands/workflow-function-management.js +91 -0
- package/dist/commands/workflow-function-management.js.map +1 -0
- package/dist/commands/workflow-node-assign-flow.d.ts.map +1 -1
- package/dist/commands/workflow-node-assign-flow.js +1 -0
- package/dist/commands/workflow-node-assign-flow.js.map +1 -1
- package/dist/commands/workflow-node-sign.d.ts +0 -12
- package/dist/commands/workflow-node-sign.d.ts.map +1 -1
- package/dist/commands/workflow-node-sign.js +31 -102
- package/dist/commands/workflow-node-sign.js.map +1 -1
- package/dist/commands/workflow-opinion-settings.d.ts +5 -0
- package/dist/commands/workflow-opinion-settings.d.ts.map +1 -0
- package/dist/commands/workflow-opinion-settings.js +51 -0
- package/dist/commands/workflow-opinion-settings.js.map +1 -0
- package/dist/commands/workflow-subprocess.d.ts.map +1 -1
- package/dist/commands/workflow-subprocess.js +370 -20
- package/dist/commands/workflow-subprocess.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +35 -61
- package/dist/commands/workflow.js.map +1 -1
- package/dist/core/client.d.ts +2 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +4 -2
- package/dist/core/client.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
- package/dist/services/actionflow/calendar_mapper.js +64 -18
- package/dist/services/actionflow/calendar_mapper.js.map +1 -1
- package/dist/services/actionflow/component_registry.d.ts.map +1 -1
- package/dist/services/actionflow/component_registry.js +6 -0
- package/dist/services/actionflow/component_registry.js.map +1 -1
- package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/document_actions.js +113 -4
- package/dist/services/actionflow/components/document_actions.js.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js +18 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
- package/dist/services/actionflow/components/index.d.ts.map +1 -1
- package/dist/services/actionflow/components/index.js +2 -1
- package/dist/services/actionflow/components/index.js.map +1 -1
- package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/meeting_create.js +5 -1
- 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 +22 -6
- package/dist/services/actionflow/components/schedule_create.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts +1 -0
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +44 -7
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/document_source.d.ts +5 -0
- package/dist/services/actionflow/document_source.d.ts.map +1 -1
- package/dist/services/actionflow/document_source.js +16 -0
- package/dist/services/actionflow/document_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +7 -0
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +44 -8
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +5 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +127 -2
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/save_workflow_draft.d.ts +7 -0
- package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
- package/dist/services/actionflow/save_workflow_draft.js +1 -1
- package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +26 -0
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/app-publish.d.ts +25 -0
- package/dist/services/app-publish.d.ts.map +1 -1
- package/dist/services/app-publish.js +38 -0
- package/dist/services/app-publish.js.map +1 -1
- package/dist/services/app-range.d.ts +66 -0
- package/dist/services/app-range.d.ts.map +1 -0
- package/dist/services/app-range.js +137 -0
- package/dist/services/app-range.js.map +1 -0
- package/dist/services/form-association.d.ts +13 -0
- package/dist/services/form-association.d.ts.map +1 -1
- package/dist/services/form-association.js +42 -0
- package/dist/services/form-association.js.map +1 -1
- package/dist/services/form-button-action.d.ts +82 -0
- package/dist/services/form-button-action.d.ts.map +1 -1
- package/dist/services/form-button-action.js +194 -2
- package/dist/services/form-button-action.js.map +1 -1
- package/dist/services/form-button-condition.d.ts +45 -0
- package/dist/services/form-button-condition.d.ts.map +1 -0
- package/dist/services/form-button-condition.js +106 -0
- package/dist/services/form-button-condition.js.map +1 -0
- package/dist/services/form-button-context.d.ts +41 -0
- package/dist/services/form-button-context.d.ts.map +1 -0
- package/dist/services/form-button-context.js +54 -0
- package/dist/services/form-button-context.js.map +1 -0
- package/dist/services/form-button-logicflow.d.ts +30 -0
- package/dist/services/form-button-logicflow.d.ts.map +1 -0
- package/dist/services/form-button-logicflow.js +59 -0
- package/dist/services/form-button-logicflow.js.map +1 -0
- package/dist/services/form-button-org.d.ts +30 -0
- package/dist/services/form-button-org.d.ts.map +1 -0
- package/dist/services/form-button-org.js +80 -0
- package/dist/services/form-button-org.js.map +1 -0
- package/dist/services/form-button-permission.d.ts +65 -0
- package/dist/services/form-button-permission.d.ts.map +1 -0
- package/dist/services/form-button-permission.js +113 -0
- package/dist/services/form-button-permission.js.map +1 -0
- package/dist/services/form-button-position.d.ts +4 -18
- package/dist/services/form-button-position.d.ts.map +1 -1
- package/dist/services/form-button-position.js +4 -36
- package/dist/services/form-button-position.js.map +1 -1
- package/dist/services/form-button-props.d.ts +55 -0
- package/dist/services/form-button-props.d.ts.map +1 -0
- package/dist/services/form-button-props.js +90 -0
- package/dist/services/form-button-props.js.map +1 -0
- package/dist/services/form-button-save.d.ts +49 -0
- package/dist/services/form-button-save.d.ts.map +1 -0
- package/dist/services/form-button-save.js +54 -0
- package/dist/services/form-button-save.js.map +1 -0
- package/dist/services/form-formula-linkage.d.ts +120 -20
- package/dist/services/form-formula-linkage.d.ts.map +1 -1
- package/dist/services/form-formula-linkage.js +253 -39
- package/dist/services/form-formula-linkage.js.map +1 -1
- package/dist/services/form-layout-io.d.ts +18 -0
- package/dist/services/form-layout-io.d.ts.map +1 -0
- package/dist/services/form-layout-io.js +89 -0
- package/dist/services/form-layout-io.js.map +1 -0
- package/dist/services/form-layout-source/artifact.d.ts +8 -0
- package/dist/services/form-layout-source/artifact.d.ts.map +1 -0
- package/dist/services/form-layout-source/artifact.js +52 -0
- package/dist/services/form-layout-source/artifact.js.map +1 -0
- package/dist/services/form-layout-source/binding.d.ts +10 -0
- package/dist/services/form-layout-source/binding.d.ts.map +1 -0
- package/dist/services/form-layout-source/binding.js +43 -0
- package/dist/services/form-layout-source/binding.js.map +1 -0
- package/dist/services/form-layout-source/compile.d.ts +7 -0
- package/dist/services/form-layout-source/compile.d.ts.map +1 -0
- package/dist/services/form-layout-source/compile.js +262 -0
- package/dist/services/form-layout-source/compile.js.map +1 -0
- package/dist/services/form-layout-source/creation.d.ts +18 -0
- package/dist/services/form-layout-source/creation.d.ts.map +1 -0
- package/dist/services/form-layout-source/creation.js +42 -0
- package/dist/services/form-layout-source/creation.js.map +1 -0
- package/dist/services/form-layout-source/excel-extractor.d.ts +7 -0
- package/dist/services/form-layout-source/excel-extractor.d.ts.map +1 -0
- package/dist/services/form-layout-source/excel-extractor.js +342 -0
- package/dist/services/form-layout-source/excel-extractor.js.map +1 -0
- package/dist/services/form-layout-source/image-border.d.ts +9 -0
- package/dist/services/form-layout-source/image-border.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-border.js +128 -0
- package/dist/services/form-layout-source/image-border.js.map +1 -0
- package/dist/services/form-layout-source/image-observation.d.ts +14 -0
- package/dist/services/form-layout-source/image-observation.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-observation.js +90 -0
- package/dist/services/form-layout-source/image-observation.js.map +1 -0
- package/dist/services/form-layout-source/image-review.d.ts +32 -0
- package/dist/services/form-layout-source/image-review.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-review.js +266 -0
- package/dist/services/form-layout-source/image-review.js.map +1 -0
- package/dist/services/form-layout-source/image-style.d.ts +16 -0
- package/dist/services/form-layout-source/image-style.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-style.js +539 -0
- package/dist/services/form-layout-source/image-style.js.map +1 -0
- package/dist/services/form-layout-source/json.d.ts +3 -0
- package/dist/services/form-layout-source/json.d.ts.map +1 -0
- package/dist/services/form-layout-source/json.js +33 -0
- package/dist/services/form-layout-source/json.js.map +1 -0
- package/dist/services/form-layout-source/presentation.d.ts +23 -0
- package/dist/services/form-layout-source/presentation.d.ts.map +1 -0
- package/dist/services/form-layout-source/presentation.js +174 -0
- package/dist/services/form-layout-source/presentation.js.map +1 -0
- package/dist/services/form-layout-source/preview.d.ts +4 -0
- package/dist/services/form-layout-source/preview.d.ts.map +1 -0
- package/dist/services/form-layout-source/preview.js +49 -0
- package/dist/services/form-layout-source/preview.js.map +1 -0
- package/dist/services/form-layout-source/schema.d.ts +20 -0
- package/dist/services/form-layout-source/schema.d.ts.map +1 -0
- package/dist/services/form-layout-source/schema.js +149 -0
- package/dist/services/form-layout-source/schema.js.map +1 -0
- package/dist/services/form-layout-source/source-grid.d.ts +8 -0
- package/dist/services/form-layout-source/source-grid.d.ts.map +1 -0
- package/dist/services/form-layout-source/source-grid.js +61 -0
- package/dist/services/form-layout-source/source-grid.js.map +1 -0
- package/dist/services/form-layout-source/types.d.ts +242 -0
- package/dist/services/form-layout-source/types.d.ts.map +1 -0
- package/dist/services/form-layout-source/types.js +2 -0
- package/dist/services/form-layout-source/types.js.map +1 -0
- package/dist/services/form-layout-source/verify.d.ts +14 -0
- package/dist/services/form-layout-source/verify.d.ts.map +1 -0
- package/dist/services/form-layout-source/verify.js +226 -0
- package/dist/services/form-layout-source/verify.js.map +1 -0
- package/dist/services/form-list-search-group.d.ts +17 -2
- package/dist/services/form-list-search-group.d.ts.map +1 -1
- package/dist/services/form-list-search-group.js +29 -12
- package/dist/services/form-list-search-group.js.map +1 -1
- package/dist/services/form-list-search.d.ts.map +1 -1
- package/dist/services/form-list-search.js +4 -0
- package/dist/services/form-list-search.js.map +1 -1
- package/dist/services/form-list-stats.d.ts.map +1 -1
- package/dist/services/form-list-stats.js +9 -2
- package/dist/services/form-list-stats.js.map +1 -1
- package/dist/services/form-message.d.ts +26 -7
- package/dist/services/form-message.d.ts.map +1 -1
- package/dist/services/form-message.js +52 -5
- package/dist/services/form-message.js.map +1 -1
- package/dist/services/form-obj-meta.d.ts +72 -0
- package/dist/services/form-obj-meta.d.ts.map +1 -0
- package/dist/services/form-obj-meta.js +103 -0
- package/dist/services/form-obj-meta.js.map +1 -0
- package/dist/services/form-permission-archive.d.ts +9 -1
- package/dist/services/form-permission-archive.d.ts.map +1 -1
- package/dist/services/form-permission-archive.js +38 -22
- package/dist/services/form-permission-archive.js.map +1 -1
- package/dist/services/form-view-populate.d.ts.map +1 -1
- package/dist/services/form-view-populate.js +7 -0
- package/dist/services/form-view-populate.js.map +1 -1
- package/dist/services/icon-path.d.ts +70 -0
- package/dist/services/icon-path.d.ts.map +1 -0
- package/dist/services/icon-path.js +80 -0
- package/dist/services/icon-path.js.map +1 -0
- package/dist/services/matrix-condition.d.ts +161 -0
- package/dist/services/matrix-condition.d.ts.map +1 -0
- package/dist/services/matrix-condition.js +403 -0
- package/dist/services/matrix-condition.js.map +1 -0
- package/dist/services/menu-catalog.d.ts +33 -0
- package/dist/services/menu-catalog.d.ts.map +1 -1
- package/dist/services/menu-catalog.js +56 -0
- package/dist/services/menu-catalog.js.map +1 -1
- package/dist/services/permission-entity.d.ts +55 -0
- package/dist/services/permission-entity.d.ts.map +1 -0
- package/dist/services/permission-entity.js +79 -0
- package/dist/services/permission-entity.js.map +1 -0
- package/dist/services/validate-help.d.ts +25 -0
- package/dist/services/validate-help.d.ts.map +1 -0
- package/dist/services/validate-help.js +29 -0
- package/dist/services/validate-help.js.map +1 -0
- package/dist/services/workflow-assign-flow.d.ts.map +1 -1
- package/dist/services/workflow-assign-flow.js.map +1 -1
- package/dist/services/workflow-function-management.d.ts +123 -0
- package/dist/services/workflow-function-management.d.ts.map +1 -0
- package/dist/services/workflow-function-management.js +425 -0
- package/dist/services/workflow-function-management.js.map +1 -0
- package/dist/services/workflow-matrix-rule.d.ts +34 -0
- package/dist/services/workflow-matrix-rule.d.ts.map +1 -0
- package/dist/services/workflow-matrix-rule.js +94 -0
- package/dist/services/workflow-matrix-rule.js.map +1 -0
- package/dist/services/workflow-opinion-settings.d.ts +67 -0
- package/dist/services/workflow-opinion-settings.d.ts.map +1 -0
- package/dist/services/workflow-opinion-settings.js +328 -0
- package/dist/services/workflow-opinion-settings.js.map +1 -0
- package/package.json +3 -1
- package/skill-docs/SKILL.md +15 -6
- package/skill-docs/_catalog.md +4 -0
- package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +2 -0
- package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +29 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +2 -2
- package/skill-docs/assets/schemas/image-style-observation.schema.json +1355 -0
- package/skill-docs/references/common/guide-plan-template.md +3 -0
- package/skill-docs/references/common/ref-cli-commands.md +77 -26
- package/skill-docs/references/ebuilder-designer/guide-designer-components.md +9 -0
- package/skill-docs/references/form/guide-create-form.md +2 -0
- package/skill-docs/references/form/guide-field-linkage.md +140 -55
- package/skill-docs/references/form/guide-form-archive-permission.md +55 -2
- package/skill-docs/references/form/guide-form-association.md +13 -0
- package/skill-docs/references/form/guide-form-button.md +87 -0
- package/skill-docs/references/form/guide-form-layout-planning.md +6 -0
- package/skill-docs/references/form/guide-form-layout-source.md +366 -0
- package/skill-docs/references/form/guide-form-message.md +19 -2
- package/skill-docs/references/form/guide-form-view.md +24 -4
- package/skill-docs/references/form/guide-formula-linkage.md +86 -12
- package/skill-docs/references/workflow/guide-function-management.md +154 -0
- package/skill-docs/references/workflow/guide-opinion-settings.md +126 -0
- package/skill-docs/references/workflow/guide-workflow.md +22 -6
package/dist/commands/wf-form.js
CHANGED
|
@@ -11,7 +11,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
11
11
|
import { readFileSync } from 'node:fs';
|
|
12
12
|
import { buildConditionDetail, resolveWorkflowEffect, readLinkageConfig } from '../services/form-linkage-condition.js';
|
|
13
13
|
import { resolveFormulaRefs } from '../services/formula-detail.js';
|
|
14
|
-
import { FLOW_ROUTE, assertAssignableTarget, buildAssignExpression, buildDrivingColumnsBody, buildDrivingEventsBody, buildFdEffect, buildFormulaLinkageName, buildFormulaSavePayload, buildLinkageApiUrl, buildLinkageDeleteBody, buildLinkageListBody, buildLinkageQueryBody, buildLinkageSavePayload, buildLinkageUpdatePayload, buildMonitorActions, buildPreCheckBody, describeColumn, extractEffect,
|
|
14
|
+
import { FLOW_ROUTE, assertAssignableTarget, buildAssignExpression, buildDrivingColumnsBody, buildDrivingEventsBody, buildFdEffect, buildFormulaLinkageName, buildFormulaSavePayload, buildLinkageApiUrl, buildLinkageExt, buildLinkageDeleteBody, buildLinkageListBody, buildLinkageQueryBody, buildLinkageSavePayload, buildLinkageUpdatePayload, buildMonitorActions, buildPreCheckBody, buildTriggerSpecs, describeColumn, extractEffect, findAssignEquals, formatSpecsLine, isAssignableTarget, isWorkflowDimension, mergeMonitorActions, moduleColumnsOf, partitionDrivingColumns, resolveDrivingColumn, specsFromStoredTriggers, storedTriggers, summarizeLinkage, formatTriggerLine, targetDriftWarning, toBareLabel, } from '../services/form-formula-linkage.js';
|
|
15
15
|
/** 流程表单选项配色(对齐浏览器抓包 styleConfig.OptionBackground,循环取用)。 */
|
|
16
16
|
const OPTION_COLORS = ['#FFBD4F', '#FF716E', '#3BD8C3', '#5B8FF9', '#5AD8A6', '#F6BD16', '#E86452', '#6DC8EC', '#945FB9', '#FF99C3'];
|
|
17
17
|
/**
|
|
@@ -83,6 +83,21 @@ async function readConfigs(client, baseUrl, formId) {
|
|
|
83
83
|
throw new Error(`getConfig 失败: ${cfg?.msg}`);
|
|
84
84
|
return { ...meta, configs: normalizeDetailTableChildren(cfg?.data?.configs || []) };
|
|
85
85
|
}
|
|
86
|
+
/** 查重规则的可选字段:主表 + 明细子字段(跳过系统字段)。 */
|
|
87
|
+
function validateCandidates(configs, formId) {
|
|
88
|
+
const candidates = [];
|
|
89
|
+
for (const c of configs) {
|
|
90
|
+
if (c.system)
|
|
91
|
+
continue;
|
|
92
|
+
if (c.componentKey === 'DataTable' || c.type === 'DetailTable') {
|
|
93
|
+
for (const ch of (c.children || []))
|
|
94
|
+
candidates.push({ fieldName: ch.name, fieldId: String(ch.id), subFormId: String(c.id) });
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
candidates.push({ fieldName: c.name, fieldId: String(c.id), subFormId: formId });
|
|
98
|
+
}
|
|
99
|
+
return candidates;
|
|
100
|
+
}
|
|
86
101
|
/** 读取运行时布局(getFormLayout pageLayouts comps),返回 singleRow=true 的字段 ID 集合。
|
|
87
102
|
* getConfig 的 configs 不带已保存的 singleRow(设计视图默认 false);field-prop/group/layout init
|
|
88
103
|
* 重排前若不从运行时合并回来,独占一行字段会被 initLayout 冲掉(实测:group initLayout 后 客户地址 singleRow 丢失)。 */
|
|
@@ -817,17 +832,7 @@ export function registerWorkflowFormCommands(program) {
|
|
|
817
832
|
const ebb = { ebbusinessid: formId };
|
|
818
833
|
// getConfig 解析字段(主表 subFormId=formId;明细 subFormId=子表 id)
|
|
819
834
|
const { configs } = await readConfigs(client, baseUrl, formId);
|
|
820
|
-
const candidates =
|
|
821
|
-
for (const c of configs) {
|
|
822
|
-
if (c.system)
|
|
823
|
-
continue;
|
|
824
|
-
if (c.componentKey === 'DataTable' || c.type === 'DetailTable') {
|
|
825
|
-
for (const ch of (c.children || []))
|
|
826
|
-
candidates.push({ fieldName: ch.name, fieldId: String(ch.id), subFormId: String(c.id) });
|
|
827
|
-
}
|
|
828
|
-
else
|
|
829
|
-
candidates.push({ fieldName: c.name, fieldId: String(c.id), subFormId: formId });
|
|
830
|
-
}
|
|
835
|
+
const candidates = validateCandidates(configs, formId);
|
|
831
836
|
const checkFields = fieldNames.map((n) => {
|
|
832
837
|
const c = candidates.find((x) => x.fieldName === n || String(x.fieldId) === n);
|
|
833
838
|
if (!c)
|
|
@@ -874,6 +879,114 @@ export function registerWorkflowFormCommands(program) {
|
|
|
874
879
|
process.exitCode = 1;
|
|
875
880
|
}
|
|
876
881
|
});
|
|
882
|
+
validateCmd.command('update')
|
|
883
|
+
.description('修改查重规则(只改传入的项,其余保持原值)')
|
|
884
|
+
.argument('<formId>', '流程表单 formId')
|
|
885
|
+
.argument('<ruleId>', '规则 ID(wf-form validate list 查看)')
|
|
886
|
+
.option('--fields <names...>', '改查重字段(多个 AND;不给则沿用原字段)')
|
|
887
|
+
.option('--help <text>', '改重复提示内容(不给则沿用原提示)')
|
|
888
|
+
.option('--remind', '改成重复时仅提醒(允许提交)')
|
|
889
|
+
.option('--no-remind', '改成重复时禁止提交(NOSUBMISSION)')
|
|
890
|
+
.action(async (formId, ruleId, cmdOpts) => {
|
|
891
|
+
try {
|
|
892
|
+
const opts = program.opts();
|
|
893
|
+
const auth = await AuthSession.fromOptions(opts);
|
|
894
|
+
if (!auth)
|
|
895
|
+
throw new Error('无法加载认证');
|
|
896
|
+
const client = new ApiClient(auth);
|
|
897
|
+
const baseUrl = auth.getBaseUrl();
|
|
898
|
+
const ebb = { ebbusinessid: formId };
|
|
899
|
+
if (cmdOpts.fields === undefined && cmdOpts.help === undefined && cmdOpts.remind === undefined) {
|
|
900
|
+
throw new Error('没有要修改的项(至少给 --fields / --help / --remind / --no-remind 之一)');
|
|
901
|
+
}
|
|
902
|
+
// 翻页取全,避免规则数超过一页时定位不到
|
|
903
|
+
const PAGE = 100;
|
|
904
|
+
const rules = [];
|
|
905
|
+
for (let pageNo = 1;; pageNo++) {
|
|
906
|
+
const res = await client.post(`${baseUrl}${ROUTE}/validate/pageFormDataValidate`, { module: MODULE, formId, pageNo, pageSize: PAGE }, ebb);
|
|
907
|
+
if (res?.code !== 200 || !res?.status)
|
|
908
|
+
throw new Error(res?.msg || '未知错误');
|
|
909
|
+
const page = res?.data?.records || [];
|
|
910
|
+
rules.push(...page);
|
|
911
|
+
if (page.length < PAGE)
|
|
912
|
+
break;
|
|
913
|
+
}
|
|
914
|
+
const rule = rules.find((r) => String(r.id) === String(ruleId));
|
|
915
|
+
if (!rule)
|
|
916
|
+
throw new Error(`规则不存在或不属于该表单: ${ruleId}(wf-form validate list 查看可用规则)`);
|
|
917
|
+
const { configs } = await readConfigs(client, baseUrl, formId);
|
|
918
|
+
const candidates = validateCandidates(configs, formId);
|
|
919
|
+
// checkFields 是整组替换:没改字段也要把完整一组带上
|
|
920
|
+
let checkFields;
|
|
921
|
+
if (cmdOpts.fields !== undefined) {
|
|
922
|
+
checkFields = cmdOpts.fields.map((n) => {
|
|
923
|
+
const c = candidates.find((x) => x.fieldName === n || String(x.fieldId) === n);
|
|
924
|
+
if (!c)
|
|
925
|
+
throw new Error(`未找到字段: ${n},可用: ${candidates.map((x) => x.fieldName).join(', ')}`);
|
|
926
|
+
return c;
|
|
927
|
+
});
|
|
928
|
+
}
|
|
929
|
+
else {
|
|
930
|
+
checkFields = (rule.checkFields || []).map((c) => {
|
|
931
|
+
const hit = candidates.find((x) => x.fieldId === String(c.fieldId));
|
|
932
|
+
if (!hit)
|
|
933
|
+
throw new Error(`规则里的字段 ${c.fieldName || c.fieldId} 已不在当前表单中,请用 --fields 重新指定查重字段`);
|
|
934
|
+
return hit;
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
if (!checkFields.length)
|
|
938
|
+
throw new Error('规则里没有查重字段,请用 --fields 指定');
|
|
939
|
+
const treatmentMethod = cmdOpts.remind === undefined
|
|
940
|
+
? (rule.treatmentMethod === 'REMINDER' ? 'REMINDER' : 'NOSUBMISSION')
|
|
941
|
+
: (cmdOpts.remind ? 'REMINDER' : 'NOSUBMISSION');
|
|
942
|
+
const helpContent = cmdOpts.help === undefined ? rule.helpContent : String(cmdOpts.help);
|
|
943
|
+
const payload = {
|
|
944
|
+
id: String(ruleId),
|
|
945
|
+
module: MODULE, formId,
|
|
946
|
+
treatmentMethod,
|
|
947
|
+
remindTime: rule.remindTime || 'SUB_REMIND',
|
|
948
|
+
taggingColour: rule.taggingColour || '#000000',
|
|
949
|
+
subFieldCheckType: rule.subFieldCheckType || 'ALL_DATA',
|
|
950
|
+
helpContent,
|
|
951
|
+
checkFields,
|
|
952
|
+
};
|
|
953
|
+
const res = await client.post(`${baseUrl}${ROUTE}/validate/save`, payload, ebb);
|
|
954
|
+
if (res?.code !== 200 || !res?.status)
|
|
955
|
+
throw new Error(`保存失败: ${res?.msg || '未知错误'}`);
|
|
956
|
+
// 回读校验:处理方式、查重字段集合、提示内容
|
|
957
|
+
const afterRules = [];
|
|
958
|
+
for (let pageNo = 1;; pageNo++) {
|
|
959
|
+
const pageRes = await client.post(`${baseUrl}${ROUTE}/validate/pageFormDataValidate`, { module: MODULE, formId, pageNo, pageSize: PAGE }, ebb);
|
|
960
|
+
const page = pageRes?.data?.records || [];
|
|
961
|
+
afterRules.push(...page);
|
|
962
|
+
if (page.length < PAGE)
|
|
963
|
+
break;
|
|
964
|
+
}
|
|
965
|
+
const after = afterRules.find((r) => String(r.id) === String(ruleId));
|
|
966
|
+
if (!after)
|
|
967
|
+
throw new Error(`保存后回读不到规则 ${ruleId}`);
|
|
968
|
+
const want = checkFields.map((f) => f.fieldId).sort().join(',');
|
|
969
|
+
const got = (after.checkFields || []).map((c) => String(c.fieldId)).sort().join(',');
|
|
970
|
+
const diffs = [];
|
|
971
|
+
if (after.treatmentMethod !== treatmentMethod)
|
|
972
|
+
diffs.push(`处理方式 期望=${treatmentMethod} 实际=${after.treatmentMethod}`);
|
|
973
|
+
if (got !== want)
|
|
974
|
+
diffs.push(`查重字段 期望=${want} 实际=${got}`);
|
|
975
|
+
if (String(after.helpContent ?? '') !== String(helpContent ?? ''))
|
|
976
|
+
diffs.push('提示内容不一致');
|
|
977
|
+
if (diffs.length)
|
|
978
|
+
throw new Error(`保存后回读不一致:${diffs.join('; ')}`);
|
|
979
|
+
const fieldNames = (after.checkFields || []).map((c) => c.fieldName);
|
|
980
|
+
const method = after.treatmentMethod === 'REMINDER' ? '提醒' : '禁止提交';
|
|
981
|
+
console.log(opts.json
|
|
982
|
+
? JSON.stringify({ success: true, ruleId: String(ruleId), fields: fieldNames, method: after.treatmentMethod }, null, 2)
|
|
983
|
+
: `已修改查重规则 [${ruleId}]:${fieldNames.join(' + ')}(${method})`);
|
|
984
|
+
}
|
|
985
|
+
catch (e) {
|
|
986
|
+
console.error(`修改查重规则失败: ${e.message}`);
|
|
987
|
+
process.exitCode = 1;
|
|
988
|
+
}
|
|
989
|
+
});
|
|
877
990
|
// ---------- wf-form linkage ----------
|
|
878
991
|
wfForm.command('linkage')
|
|
879
992
|
.description('显隐联动管理(/api/workflow/core/form/setting/viewlinkage)')
|
|
@@ -2118,6 +2231,70 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2118
2231
|
}
|
|
2119
2232
|
return res.data;
|
|
2120
2233
|
}
|
|
2234
|
+
/** 改公式正文(表达式 / 赋值目标):公式记录与联动分开,走 formula/save 带 formulaId 原地更新。 */
|
|
2235
|
+
async function wfUpdateFormula(client, baseUrl, formId, workflowId, record, o) {
|
|
2236
|
+
const excelId = summarizeLinkage(record).excelId;
|
|
2237
|
+
if (!excelId)
|
|
2238
|
+
throw new Error('这条联动没有关联公式(excelId 为空),无法修改公式');
|
|
2239
|
+
const detailRes = await client.post(`${baseUrl}/api/excel/formula/detail`, { formulaId: excelId });
|
|
2240
|
+
const fd = detailRes?.resultJson?.data;
|
|
2241
|
+
if (!detailRes?.resultJson?.excute || !fd) {
|
|
2242
|
+
throw new Error(`读取原公式失败: ${detailRes?.resultJson?.error || detailRes?.msg || '未知错误'}`);
|
|
2243
|
+
}
|
|
2244
|
+
const { columns, source } = await wfLinkageContext(client, baseUrl, formId, workflowId);
|
|
2245
|
+
let targetCol;
|
|
2246
|
+
if (o.target !== undefined) {
|
|
2247
|
+
targetCol = resolveDrivingColumn(columns, o.target, FLOW_ROUTE);
|
|
2248
|
+
}
|
|
2249
|
+
else {
|
|
2250
|
+
// 不给 --target 就沿用原公式的目标 —— 参数表首位在建公式时恒为赋值目标
|
|
2251
|
+
const curId = String(fd?.parameters?.[0]?.fieldId ?? '');
|
|
2252
|
+
const hit = columns.find((c) => String(c.id) === curId);
|
|
2253
|
+
if (!hit)
|
|
2254
|
+
throw new Error('无法从原公式的参数表确定赋值目标,请用 --target 指定');
|
|
2255
|
+
targetCol = hit;
|
|
2256
|
+
}
|
|
2257
|
+
assertAssignableTarget(targetCol, FLOW_ROUTE);
|
|
2258
|
+
const drift = targetDriftWarning(targetCol, FLOW_ROUTE);
|
|
2259
|
+
if (drift)
|
|
2260
|
+
console.error(` ⚠ ${drift}`);
|
|
2261
|
+
let body;
|
|
2262
|
+
if (o.expression !== undefined) {
|
|
2263
|
+
body = readExpressionArg(o.expression);
|
|
2264
|
+
}
|
|
2265
|
+
else {
|
|
2266
|
+
// 只改目标:沿用原公式右侧,剥掉旧的赋值左侧
|
|
2267
|
+
const stored = String(fd.expressSql || '');
|
|
2268
|
+
const eq = findAssignEquals(stored);
|
|
2269
|
+
body = eq >= 0 ? stored.slice(eq + 1).trim() : stored;
|
|
2270
|
+
}
|
|
2271
|
+
const { expression } = buildAssignExpression(targetCol, body);
|
|
2272
|
+
const parsed = resolveFormulaRefs(expression, {
|
|
2273
|
+
mainFields: source.mainFields, detailTables: source.detailTables,
|
|
2274
|
+
moduleColumns: moduleColumnsOf(columns, FLOW_ROUTE),
|
|
2275
|
+
formId, module: FLOW_ROUTE.module, hint: FLOW_ROUTE.columnsHint,
|
|
2276
|
+
});
|
|
2277
|
+
for (const w of parsed.warnings)
|
|
2278
|
+
console.error(` ⚠ ${w}`);
|
|
2279
|
+
if (parsed.errors.length)
|
|
2280
|
+
throw new Error(parsed.errors.join('\n'));
|
|
2281
|
+
if (String(parsed.parameters[0]?.fieldId) !== String(targetCol.id)) {
|
|
2282
|
+
throw new Error(`赋值目标没有出现在公式参数表首位(首位是 ${parsed.parameters[0]?.fieldId ?? '空'}),已中止`);
|
|
2283
|
+
}
|
|
2284
|
+
const formulaName = String(fd.name || summarizeLinkage(record).excelName || '函数联动公式');
|
|
2285
|
+
const saveRes = await client.post(`${baseUrl}/api/excel/formula/save`, buildFormulaSavePayload({
|
|
2286
|
+
expression: parsed.normalizedExpression, name: formulaName,
|
|
2287
|
+
parameters: parsed.parameters, formulaId: excelId, route: FLOW_ROUTE,
|
|
2288
|
+
}));
|
|
2289
|
+
if (!saveRes?.resultJson?.excute) {
|
|
2290
|
+
throw new Error(`公式更新失败: ${saveRes?.resultJson?.error || saveRes?.msg || '未知错误'}`);
|
|
2291
|
+
}
|
|
2292
|
+
const newId = String(saveRes.resultJson.id || '');
|
|
2293
|
+
if (newId !== excelId) {
|
|
2294
|
+
throw new Error(`期望原地更新 ${excelId},平台返回的是 ${newId}(可能新建了一条公式,联动仍指向旧公式)`);
|
|
2295
|
+
}
|
|
2296
|
+
console.error(` 公式已更新: ${parsed.normalizedExpression}`);
|
|
2297
|
+
}
|
|
2121
2298
|
flCmd.command('list')
|
|
2122
2299
|
.description('列出该流程表单下的函数联动')
|
|
2123
2300
|
.argument('<formId>', '流程表单 formId')
|
|
@@ -2147,6 +2324,7 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2147
2324
|
console.log(` [${s.id}] ${s.name} (${s.state ? '启用' : '停用'})`);
|
|
2148
2325
|
console.log(` 生效范围: ${wfEffectLabel(s.effect)}`);
|
|
2149
2326
|
console.log(` 触发: ${formatTriggerLine(s)}`);
|
|
2327
|
+
console.log(` 联动出值继续触发: ${s.fissionState ? '开' : '关'}`);
|
|
2150
2328
|
}
|
|
2151
2329
|
if (records.length)
|
|
2152
2330
|
console.log(' (列表不返回公式正文,要表达式/参数用 wf-form formula-linkage read)');
|
|
@@ -2181,6 +2359,7 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2181
2359
|
console.log(` refId: ${data?.refId || '—'}`);
|
|
2182
2360
|
console.log(` 生效范围: ${wfEffectLabel(s.effect)}`);
|
|
2183
2361
|
console.log(` 触发: ${formatTriggerLine(s)}`);
|
|
2362
|
+
console.log(` 联动出值继续触发: ${s.fissionState ? '开' : '关'}`);
|
|
2184
2363
|
console.log(` 公式记录: ${s.excelName} (excelId=${s.excelId})`);
|
|
2185
2364
|
console.log(` 表达式: ${s.expression || '-'}`);
|
|
2186
2365
|
if (s.parameters.length) {
|
|
@@ -2262,12 +2441,12 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2262
2441
|
}
|
|
2263
2442
|
});
|
|
2264
2443
|
flCmd.command('add')
|
|
2265
|
-
.description('
|
|
2444
|
+
.description('新增函数联动:触发时机(可多个)+ 触发字段 + 赋值目标 + 公式')
|
|
2266
2445
|
.argument('<formId>', '流程表单 formId')
|
|
2267
2446
|
.requiredOption('--target <field>', '赋值目标字段(被写入)')
|
|
2268
2447
|
.requiredOption('--expression <expr>', '公式右侧函数体;也接受整段赋值式,或用 @文件 传长表达式')
|
|
2269
|
-
.option('--event <event
|
|
2270
|
-
.option('--trigger <fields...>', '
|
|
2448
|
+
.option('--event <event...>', '触发时机,**可多个**;每个可自带触发字段 —— 「名称或 type」或「类型:字段,字段」。默认 changeField 值改变时', ['changeField'])
|
|
2449
|
+
.option('--trigger <fields...>', '触发字段,可多个。作用于**没有自带字段**的字段级触发时机')
|
|
2271
2450
|
.option('--effect <dimension>', '生效维度: form=当前表单(默认)/ formLayout=表单布局 / workFlow=当前工作流 / includeNode=选择节点')
|
|
2272
2451
|
.option('--workflow-id <id>', '流程 ID(refId,也是 workFlow/includeNode 的取值来源;不给按 formId 兜底)')
|
|
2273
2452
|
.option('--node <node>', 'includeNode 的节点(id 或节点名)')
|
|
@@ -2275,6 +2454,7 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2275
2454
|
.option('--name <name>', '联动名称(默认「<公式名> - 公式_<时间戳>」)')
|
|
2276
2455
|
.option('--formula-name <name>', '公式名称')
|
|
2277
2456
|
.option('--formula-id <id>', '复用/更新已有公式(传了就原地更新那张公式)')
|
|
2457
|
+
.option('--fission <onoff>', '联动出的值继续触发联动: on(默认)/ off')
|
|
2278
2458
|
.action(async (formId, cmdOpts) => {
|
|
2279
2459
|
try {
|
|
2280
2460
|
const opts = program.opts();
|
|
@@ -2286,22 +2466,21 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2286
2466
|
const ebb = { ebbusinessid: formId };
|
|
2287
2467
|
const refId = cmdOpts.workflowId || formId;
|
|
2288
2468
|
const { events, columns, source } = await wfLinkageContext(client, baseUrl, formId, cmdOpts.workflowId);
|
|
2289
|
-
const event = resolveDrivingEvent(events, cmdOpts.event);
|
|
2290
2469
|
const targetCol = resolveDrivingColumn(columns, cmdOpts.target, FLOW_ROUTE);
|
|
2291
2470
|
assertAssignableTarget(targetCol, FLOW_ROUTE);
|
|
2292
2471
|
const drift = targetDriftWarning(targetCol, FLOW_ROUTE);
|
|
2293
2472
|
if (drift)
|
|
2294
2473
|
console.error(` ⚠ ${drift}`);
|
|
2295
|
-
const
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
const monitorActions = buildMonitorActions(
|
|
2474
|
+
const built = buildTriggerSpecs(events, columns, cmdOpts.event, cmdOpts.trigger || [], FLOW_ROUTE);
|
|
2475
|
+
const specs = built.specs;
|
|
2476
|
+
for (const w of built.warnings)
|
|
2477
|
+
console.error(` ⚠ ${w}`);
|
|
2478
|
+
const monitorActions = buildMonitorActions(specs);
|
|
2300
2479
|
const { effect } = await wfEffectOf(client, baseUrl, formId, cmdOpts);
|
|
2301
2480
|
const { expression, stripped } = buildAssignExpression(targetCol, readExpressionArg(cmdOpts.expression));
|
|
2302
2481
|
if (stripped)
|
|
2303
2482
|
console.error(' ℹ 表达式自带赋值式,已按 --target 校验左侧并沿用右侧');
|
|
2304
|
-
console.error(` 联动: ${effect.effectName} / ${
|
|
2483
|
+
console.error(` 联动: ${effect.effectName} / ${formatSpecsLine(specs)} → 填 ${toBareLabel(targetCol)}(${targetCol.id})`);
|
|
2305
2484
|
// 这条路由的 parameter **不带 appId 键**,所以 ctx 里不给 appId
|
|
2306
2485
|
const parsed = resolveFormulaRefs(expression, {
|
|
2307
2486
|
mainFields: source.mainFields, detailTables: source.detailTables,
|
|
@@ -2333,6 +2512,7 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2333
2512
|
const linkRes = await client.post(`${baseUrl}${buildLinkageApiUrl(FLOW_ROUTE, 'saveFormDataLinkage')}`, buildLinkageSavePayload({
|
|
2334
2513
|
formId, appId: '', objId: '', linkageName, excelId, excelName: formulaName,
|
|
2335
2514
|
monitorActions, route: FLOW_ROUTE, refId,
|
|
2515
|
+
linkageExt: buildLinkageExt({ fissionState: parseFissionOrExit(cmdOpts.fission) }),
|
|
2336
2516
|
}), ebb);
|
|
2337
2517
|
if (linkRes?.code !== 200 || !linkRes?.status) {
|
|
2338
2518
|
throw new Error(`联动保存失败: ${linkRes?.msg || '未知错误'}(公式已创建 excelId=${excelId},可用 --formula-id ${excelId} 复用重试)`);
|
|
@@ -2353,10 +2533,13 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2353
2533
|
success: true, linkageId, excelId, formId, refId, effect: effect.effectName,
|
|
2354
2534
|
expression: s.expression || parsed.normalizedExpression,
|
|
2355
2535
|
target: { id: targetCol.id, name: toBareLabel(targetCol) },
|
|
2356
|
-
|
|
2536
|
+
events: specs.map((sp) => ({
|
|
2537
|
+
type: sp.event.type, name: sp.event.name,
|
|
2538
|
+
triggers: sp.cols.map((c) => ({ id: String(c.id), name: toBareLabel(c) })),
|
|
2539
|
+
})),
|
|
2357
2540
|
};
|
|
2358
2541
|
console.log(opts.json ? JSON.stringify(out, null, 2)
|
|
2359
|
-
: `函数联动已创建: [${linkageId}] ${effect.effectName} / ${
|
|
2542
|
+
: `函数联动已创建: [${linkageId}] ${effect.effectName} / ${formatSpecsLine(specs)} → ${toBareLabel(targetCol)}`);
|
|
2360
2543
|
}
|
|
2361
2544
|
catch (e) {
|
|
2362
2545
|
console.error(`新增函数联动失败: ${e.message}`);
|
|
@@ -2364,17 +2547,20 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2364
2547
|
}
|
|
2365
2548
|
});
|
|
2366
2549
|
flCmd.command('update')
|
|
2367
|
-
.description('
|
|
2550
|
+
.description('改已有函数联动的触发时机/生效维度/名称/启停/公式(不给 --event/--trigger 就原样沿用现有的触发时机)')
|
|
2368
2551
|
.argument('<formId>', '流程表单 formId')
|
|
2369
2552
|
.argument('<linkageId>', '联动 ID')
|
|
2370
|
-
.option('--
|
|
2371
|
-
.option('--
|
|
2553
|
+
.option('--expression <expr>', '改公式右侧函数体(也可整段赋值式,或用 @文件)。不给则沿用现有公式')
|
|
2554
|
+
.option('--target <field>', '改赋值目标字段(只改目标时沿用现有公式右侧)')
|
|
2555
|
+
.option('--event <event...>', '改触发时机,可多个(写法同 add:可带 --event 类型:字段,字段)。不给则沿用现有')
|
|
2556
|
+
.option('--trigger <fields...>', '改触发字段(作用于记录里的字段级触发时机)。不给则沿用现有')
|
|
2372
2557
|
.option('--effect <dimension>', '改生效维度: form / formLayout / workFlow / includeNode')
|
|
2373
2558
|
.option('--workflow-id <id>', '流程 ID(refId;不给沿用记录里的)')
|
|
2374
2559
|
.option('--node <node>', 'includeNode 的节点')
|
|
2375
2560
|
.option('--layout-id <id>', 'formLayout 指定的布局')
|
|
2376
2561
|
.option('--name <name>', '改联动名称')
|
|
2377
2562
|
.option('--state <onoff>', '启用或停用: on / off')
|
|
2563
|
+
.option('--fission <onoff>', '联动出的值继续触发联动: on / off(不给则沿用现有)')
|
|
2378
2564
|
.action(async (formId, linkageId, cmdOpts) => {
|
|
2379
2565
|
try {
|
|
2380
2566
|
const opts = program.opts();
|
|
@@ -2386,26 +2572,44 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2386
2572
|
const ebb = { ebbusinessid: formId };
|
|
2387
2573
|
const record = await wfReadLinkage(client, baseUrl, formId, linkageId, cmdOpts.workflowId);
|
|
2388
2574
|
const refId = String(record?.refId || cmdOpts.workflowId || formId);
|
|
2389
|
-
const
|
|
2390
|
-
const { events, columns } = await wfLinkageContext(client, baseUrl, formId, cmdOpts.workflowId);
|
|
2391
|
-
const event = resolveDrivingEvent(events, cmdOpts.event || cur.eventType);
|
|
2392
|
-
const triggerInput = cmdOpts.trigger?.length ? cmdOpts.trigger : cur.triggerIds;
|
|
2393
|
-
const triggerCols = [];
|
|
2394
|
-
for (const t of triggerInput) {
|
|
2395
|
-
const col = findColumnById(columns, t) || (() => { try {
|
|
2396
|
-
return resolveDrivingColumn(columns, t, FLOW_ROUTE);
|
|
2397
|
-
}
|
|
2398
|
-
catch {
|
|
2399
|
-
return undefined;
|
|
2400
|
-
} })();
|
|
2401
|
-
if (!col)
|
|
2402
|
-
throw new Error(`触发字段「${t}」在当前表单里找不到了(可能已被删除)。用 wf-form formula-linkage columns 复核`);
|
|
2403
|
-
triggerCols.push(col);
|
|
2404
|
-
}
|
|
2405
|
-
const monitorActions = buildMonitorActions(event, triggerCols);
|
|
2575
|
+
const curEffect = extractEffect(record);
|
|
2406
2576
|
const effect = cmdOpts.effect
|
|
2407
2577
|
? (await wfEffectOf(client, baseUrl, formId, cmdOpts)).effect
|
|
2408
|
-
:
|
|
2578
|
+
: curEffect;
|
|
2579
|
+
// 在「表单/布局」与「工作流/节点」之间换维度时,可用事件整个换了一套;不给 --event 就会存出
|
|
2580
|
+
// 一条「事件是工作流事件、维度却是当前表单」的坏规则 —— 当场拦下
|
|
2581
|
+
if (isWorkflowDimension(curEffect?.effectType) !== isWorkflowDimension(effect?.effectType)
|
|
2582
|
+
&& !cmdOpts.event?.length) {
|
|
2583
|
+
throw new Error('生效维度在「当前表单/表单布局」与「当前工作流/选择节点」之间切换时,必须同时用 --event 指定新维度下可用的触发时机');
|
|
2584
|
+
}
|
|
2585
|
+
let specs = null;
|
|
2586
|
+
const wantEvents = !!cmdOpts.event?.length;
|
|
2587
|
+
const wantTrigger = !!cmdOpts.trigger?.length;
|
|
2588
|
+
if (wantEvents || wantTrigger) {
|
|
2589
|
+
const { events, columns } = await wfLinkageContext(client, baseUrl, formId, cmdOpts.workflowId);
|
|
2590
|
+
if (wantEvents) {
|
|
2591
|
+
const built = buildTriggerSpecs(events, columns, cmdOpts.event, cmdOpts.trigger || [], FLOW_ROUTE);
|
|
2592
|
+
specs = built.specs;
|
|
2593
|
+
for (const w of built.warnings)
|
|
2594
|
+
console.error(` ⚠ ${w}`);
|
|
2595
|
+
}
|
|
2596
|
+
else {
|
|
2597
|
+
// 只给 --trigger:触发时机沿用记录里的(记录自己说了算哪些是字段级),只换字段
|
|
2598
|
+
const built = specsFromStoredTriggers(storedTriggers(record), events, columns, cmdOpts.trigger || []);
|
|
2599
|
+
specs = built.specs;
|
|
2600
|
+
if (!built.overrideApplied)
|
|
2601
|
+
console.error(' ⚠ 记录里没有字段级触发时机,--trigger 已忽略');
|
|
2602
|
+
}
|
|
2603
|
+
}
|
|
2604
|
+
// 公式正文不在联动记录里,单独更新(见 wfUpdateFormula)
|
|
2605
|
+
if (cmdOpts.expression !== undefined || cmdOpts.target !== undefined) {
|
|
2606
|
+
await wfUpdateFormula(client, baseUrl, formId, cmdOpts.workflowId, record, {
|
|
2607
|
+
expression: cmdOpts.expression, target: cmdOpts.target,
|
|
2608
|
+
});
|
|
2609
|
+
}
|
|
2610
|
+
// ⚠ 两个都没给就**原样透传**读回的 monitorActions —— 早先这里是拿 `actions[0]` 重建,
|
|
2611
|
+
// 一条挂了多个触发时机的规则改个名字就会把其余触发时机静默抹掉
|
|
2612
|
+
const monitorActions = specs ? mergeMonitorActions(record?.monitorActions || [], specs) : (record?.monitorActions || []);
|
|
2409
2613
|
let linkageState = record?.linkageState !== false;
|
|
2410
2614
|
if (cmdOpts.state) {
|
|
2411
2615
|
const v = String(cmdOpts.state).toLowerCase();
|
|
@@ -2417,14 +2621,21 @@ export function registerWorkflowFormCommands(program) {
|
|
|
2417
2621
|
appId: '', objId: '',
|
|
2418
2622
|
linkageName: cmdOpts.name || String(record?.linkageName || ''),
|
|
2419
2623
|
linkageState, monitorActions, effect, route: FLOW_ROUTE, refId,
|
|
2624
|
+
fissionState: cmdOpts.fission !== undefined ? parseFissionOrExit(cmdOpts.fission) : undefined,
|
|
2420
2625
|
}), ebb);
|
|
2421
2626
|
if (res?.code !== 200 || !res?.status)
|
|
2422
2627
|
throw new Error(`更新失败: ${res?.msg || '未知错误'}`);
|
|
2423
2628
|
await client.post(`${baseUrl}${buildLinkageApiUrl(FLOW_ROUTE, 'preCheck')}`, buildPreCheckBody(FLOW_ROUTE, { formId, linkageIds: [linkageId], refId }), ebb);
|
|
2424
2629
|
const after = summarizeLinkage(await wfReadLinkage(client, baseUrl, formId, linkageId, refId));
|
|
2425
|
-
|
|
2630
|
+
// 触发时机数量对不上就是被平台吞了 —— 这种静默丢失必须当场喊出来
|
|
2631
|
+
const want = monitorActions.map((a) => String(a?.actionType || '')).filter(Boolean).join(',');
|
|
2632
|
+
const got = after.triggers.map((t) => t.eventType).join(',');
|
|
2633
|
+
if (want !== got) {
|
|
2634
|
+
console.error(` ⚠ 回读的触发时机与提交的不一致,以平台为准\n 提交: ${want || '(空)'}\n 回读: ${got || '(空)'}`);
|
|
2635
|
+
}
|
|
2636
|
+
const out = { success: true, linkageId, name: after.name, state: after.state, effect: wfEffectLabel(after.effect), events: after.triggers };
|
|
2426
2637
|
console.log(opts.json ? JSON.stringify(out, null, 2)
|
|
2427
|
-
: `函数联动已更新: [${linkageId}] ${after.name} (${after.state ? '启用' : '停用'}) ${wfEffectLabel(after.effect)} / ${
|
|
2638
|
+
: `函数联动已更新: [${linkageId}] ${after.name} (${after.state ? '启用' : '停用'}) ${wfEffectLabel(after.effect)} / ${formatTriggerLine(after)}`);
|
|
2428
2639
|
}
|
|
2429
2640
|
catch (e) {
|
|
2430
2641
|
console.error(`更新函数联动失败: ${e.message}`);
|
|
@@ -2478,6 +2689,17 @@ function readExpressionArg(raw) {
|
|
|
2478
2689
|
throw new Error(`读取表达式文件失败: ${v.slice(1)}(${e?.message || e})`);
|
|
2479
2690
|
}
|
|
2480
2691
|
}
|
|
2692
|
+
/** 「联动出的值继续触发联动」:on=1 / off=0。 */
|
|
2693
|
+
function parseFissionOrExit(input, fallback = 1) {
|
|
2694
|
+
if (!input)
|
|
2695
|
+
return fallback;
|
|
2696
|
+
const v = String(input).toLowerCase();
|
|
2697
|
+
if (v === 'on' || v === '1')
|
|
2698
|
+
return 1;
|
|
2699
|
+
if (v === 'off' || v === '0')
|
|
2700
|
+
return 0;
|
|
2701
|
+
throw new Error('--fission 只接受 on / off');
|
|
2702
|
+
}
|
|
2481
2703
|
/** 生效维度的可读写法:当前表单 / 表单布局(布局名)/ 当前工作流(流程名【V1】)/ 选择节点(节点名)。 */
|
|
2482
2704
|
function wfEffectLabel(e) {
|
|
2483
2705
|
if (!e || e.effectType === 'form')
|