@gadmin2n/schematics 0.0.144 → 0.0.145
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/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +140 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/data-mngt.seed.ts +0 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +694 -327
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-outbox.ts +57 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +35 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +224 -59
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +23 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +16 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +98 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +26 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +17 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +28 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +63 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +151 -38
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +16 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +23 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.spec.ts +130 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +62 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +15 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +70 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +31 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.spec.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +28 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +50 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +26 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +53 -47
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +541 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +442 -200
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +150 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +56 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +16 -60
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +44 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +258 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +127 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.spec.ts +85 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.ts +108 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +96 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +77 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +23 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +0 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +245 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +639 -188
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +408 -235
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +1 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +279 -95
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +360 -80
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-event-catalog.spec.ts +323 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +773 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +7 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +0 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.spec.ts +184 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +69 -138
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.spec.ts +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +59 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +86 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.spec.ts +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +78 -43
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +103 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +57 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +1000 -240
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +2184 -317
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +279 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +5 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +5 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +12 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +10 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +2 -24
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +3 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +25 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.test.tsx +71 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.tsx +89 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +52 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +10 -33
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +13 -37
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +14 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/workflowAction.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useReferenceUpload.ts +95 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +672 -110
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +676 -114
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +13 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +38 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +276 -376
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +126 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.test.tsx +50 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +48 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +32 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.test.tsx +111 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.tsx +167 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/business-events.css +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.test.tsx +106 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +324 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.test.tsx +73 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +359 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CanvasZoomControls.tsx +46 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +9 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +105 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +90 -48
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +3 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.test.tsx +259 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +167 -103
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +142 -140
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +60 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +25 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +364 -200
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +220 -52
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +260 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +300 -130
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +507 -33
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +630 -592
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +67 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.test.tsx +90 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.tsx +325 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.test.tsx +52 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +14 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +42 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +76 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowWorkspaceHeader.tsx +56 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/parameter-binding-editor.css +46 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/workflow-code-editor.css +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +53 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +123 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +85 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +29 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +75 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +69 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.test.tsx +494 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +665 -194
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.test.tsx +92 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.ts +96 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.test.tsx +297 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +135 -65
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +53 -42
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +344 -155
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +79 -58
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +123 -144
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +169 -98
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/node-instance-form.css +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +54 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +854 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +41 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +75 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +20 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +61 -66
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +33 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +47 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/BranchConfigEditors.test.tsx +104 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +22 -52
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +72 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +78 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CronTriggerConfigEditor.tsx +569 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +130 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DelayConfigEditor.tsx +100 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +620 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +22 -45
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +25 -92
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +3 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.test.tsx +58 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.tsx +107 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +212 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +214 -304
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +175 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +693 -293
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/IfElseConfigEditor.tsx +190 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.test.tsx +152 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.tsx +286 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParallelConfigEditor.tsx +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParameterBindingListEditor.tsx +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +495 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.test.tsx +124 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.tsx +222 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +2 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SwitchConfigEditor.tsx +204 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +9 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/callable-workflow.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/code-config.css +96 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/event-catalog.api.ts +117 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/http-request-config.css +242 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +194 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +264 -167
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +6 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +19 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +28 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.test.tsx +59 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.ts +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.test.ts +311 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.ts +198 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.test.ts +143 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +103 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +158 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +117 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.test.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.ts +48 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.test.ts +55 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +95 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +148 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +62 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.test.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.ts +26 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.test.ts +502 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.ts +694 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.test.ts +27 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.ts +33 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.test.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.ts +52 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.test.ts +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.ts +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.test.ts +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.ts +120 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/workflow-ui.css +481 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +0 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +0 -86
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +0 -60
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts
CHANGED
|
@@ -19,12 +19,15 @@ type NodeTypeSeed = BaseNodeTypeSeed & {
|
|
|
19
19
|
instancePolicy: 'REQUIRED' | 'OPTIONAL' | 'INLINE_ONLY';
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
const
|
|
22
|
+
const templatableNode = (definition: BaseNodeTypeSeed): NodeTypeSeed => ({
|
|
23
23
|
...definition,
|
|
24
24
|
runtimeKey: definition.type,
|
|
25
25
|
schemaVersion: 1,
|
|
26
|
-
instancePolicy: '
|
|
27
|
-
uiSchema:
|
|
26
|
+
instancePolicy: 'OPTIONAL',
|
|
27
|
+
uiSchema:
|
|
28
|
+
definition.type === 'manual_trigger'
|
|
29
|
+
? { widget: 'manual-trigger-config' }
|
|
30
|
+
: {},
|
|
28
31
|
});
|
|
29
32
|
|
|
30
33
|
const PARAMETER_BINDING_SCHEMA = {
|
|
@@ -34,7 +37,7 @@ const PARAMETER_BINDING_SCHEMA = {
|
|
|
34
37
|
properties: {
|
|
35
38
|
source: {
|
|
36
39
|
type: 'string',
|
|
37
|
-
enum: ['INPUT', 'WORKFLOW'
|
|
40
|
+
enum: ['INPUT', 'WORKFLOW'],
|
|
38
41
|
},
|
|
39
42
|
path: { type: 'string', minLength: 1 },
|
|
40
43
|
},
|
|
@@ -57,36 +60,62 @@ const PARAMETER_BINDING_SCHEMA = {
|
|
|
57
60
|
],
|
|
58
61
|
};
|
|
59
62
|
|
|
63
|
+
const APPROVAL_PARAMETER_BINDING_SCHEMA = {
|
|
64
|
+
...PARAMETER_BINDING_SCHEMA,
|
|
65
|
+
oneOf: [
|
|
66
|
+
{
|
|
67
|
+
...PARAMETER_BINDING_SCHEMA.oneOf[0],
|
|
68
|
+
properties: {
|
|
69
|
+
...PARAMETER_BINDING_SCHEMA.oneOf[0].properties,
|
|
70
|
+
source: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
enum: ['INPUT', 'WORKFLOW', 'APPROVAL'],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
PARAMETER_BINDING_SCHEMA.oneOf[1],
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
|
|
60
80
|
const PARAMETER_BINDINGS_SCHEMA = {
|
|
61
81
|
type: 'object',
|
|
62
82
|
additionalProperties: PARAMETER_BINDING_SCHEMA,
|
|
63
83
|
};
|
|
64
84
|
|
|
65
|
-
const
|
|
85
|
+
const HTTP_PARAMETER_BINDINGS_SCHEMA = {
|
|
86
|
+
...PARAMETER_BINDINGS_SCHEMA,
|
|
87
|
+
propertyNames: { minLength: 1, pattern: '\\S' },
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
66
91
|
// ─── TRIGGER ───────────────────────────────────────────────────────────────
|
|
67
92
|
{
|
|
68
93
|
type: 'cron_trigger',
|
|
69
94
|
category: 'TRIGGER',
|
|
70
|
-
label: '
|
|
95
|
+
label: '定时触发',
|
|
71
96
|
icon: 'ClockCircleOutlined',
|
|
72
|
-
description: '
|
|
97
|
+
description: '按照配置的时间计划自动启动 Workflow',
|
|
73
98
|
configSchema: {
|
|
74
99
|
type: 'object',
|
|
100
|
+
additionalProperties: false,
|
|
75
101
|
properties: {
|
|
76
|
-
|
|
77
|
-
type: '
|
|
78
|
-
|
|
102
|
+
cronExpressions: {
|
|
103
|
+
type: 'array',
|
|
104
|
+
minItems: 1,
|
|
105
|
+
uniqueItems: true,
|
|
106
|
+
items: { type: 'string', minLength: 1 },
|
|
107
|
+
description: '一个或多个 Temporal Schedule Cron 表达式',
|
|
79
108
|
},
|
|
80
109
|
timezone: {
|
|
81
110
|
type: 'string',
|
|
82
|
-
description: 'IANA
|
|
111
|
+
description: 'IANA 时区,例如 Asia/Shanghai',
|
|
83
112
|
},
|
|
84
113
|
},
|
|
85
|
-
required: ['
|
|
114
|
+
required: ['cronExpressions'],
|
|
86
115
|
},
|
|
87
116
|
inputSchema: { type: 'object', properties: {} },
|
|
88
117
|
outputSchema: {
|
|
89
|
-
description: 'Workflow
|
|
118
|
+
description: '定时启动 Workflow 时提供的启动数据',
|
|
90
119
|
},
|
|
91
120
|
outputs: [],
|
|
92
121
|
},
|
|
@@ -101,41 +130,27 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
101
130
|
properties: {
|
|
102
131
|
path: {
|
|
103
132
|
type: 'string',
|
|
133
|
+
minLength: 1,
|
|
134
|
+
pattern: '^[A-Za-z0-9](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$',
|
|
104
135
|
description:
|
|
105
|
-
'
|
|
136
|
+
'外部调用路径,例如 order-paid;界面会显示最终可访问地址',
|
|
106
137
|
},
|
|
107
138
|
method: {
|
|
108
139
|
type: 'string',
|
|
109
140
|
enum: ['POST'],
|
|
110
141
|
default: 'POST',
|
|
111
|
-
description: '
|
|
142
|
+
description: '外部请求统一使用 POST',
|
|
112
143
|
},
|
|
113
144
|
verificationMode: {
|
|
114
145
|
type: 'string',
|
|
115
146
|
enum: ['HMAC', 'NONE'],
|
|
116
147
|
default: 'HMAC',
|
|
117
|
-
description:
|
|
118
|
-
'HMAC verifies signed callers. NONE directly accepts systems that cannot sign requests.',
|
|
148
|
+
description: 'HMAC 校验调用方签名;NONE 用于无法签名的可信系统',
|
|
119
149
|
},
|
|
120
150
|
secret: {
|
|
121
151
|
type: 'string',
|
|
122
152
|
description:
|
|
123
|
-
'HMAC-SHA256
|
|
124
|
-
},
|
|
125
|
-
responseMode: {
|
|
126
|
-
type: 'string',
|
|
127
|
-
enum: ['IMMEDIATE', 'WAIT_FOR_RESULT'],
|
|
128
|
-
default: 'IMMEDIATE',
|
|
129
|
-
description:
|
|
130
|
-
'Immediately acknowledge the request or wait for a Return Result node.',
|
|
131
|
-
},
|
|
132
|
-
responseTimeoutSeconds: {
|
|
133
|
-
type: 'integer',
|
|
134
|
-
minimum: 1,
|
|
135
|
-
maximum: 300,
|
|
136
|
-
default: 60,
|
|
137
|
-
description:
|
|
138
|
-
'Maximum time to keep the HTTP request open in WAIT_FOR_RESULT mode.',
|
|
153
|
+
'用于 HMAC-SHA256 验签的密钥;调用方需传入 X-Workflow-Signature 和 X-Workflow-Timestamp',
|
|
139
154
|
},
|
|
140
155
|
},
|
|
141
156
|
required: ['path', 'method'],
|
|
@@ -151,21 +166,24 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
151
166
|
else: { required: ['secret'] },
|
|
152
167
|
},
|
|
153
168
|
],
|
|
169
|
+
additionalProperties: false,
|
|
154
170
|
},
|
|
155
171
|
inputSchema: {
|
|
156
172
|
type: 'object',
|
|
157
173
|
properties: {
|
|
158
|
-
body: {
|
|
174
|
+
body: { description: '请求体原始内容' },
|
|
159
175
|
headers: { type: 'object' },
|
|
160
176
|
query: { type: 'object' },
|
|
177
|
+
receivedAt: { type: 'string' },
|
|
161
178
|
},
|
|
162
179
|
},
|
|
163
180
|
outputSchema: {
|
|
164
181
|
type: 'object',
|
|
165
182
|
properties: {
|
|
166
|
-
body: {
|
|
167
|
-
headers: { type: 'object', description: '
|
|
168
|
-
query: { type: 'object', description: '
|
|
183
|
+
body: { description: '请求体原始内容' },
|
|
184
|
+
headers: { type: 'object', description: '请求头' },
|
|
185
|
+
query: { type: 'object', description: 'URL 查询参数' },
|
|
186
|
+
receivedAt: { type: 'string', description: '收到请求的时间' },
|
|
169
187
|
},
|
|
170
188
|
},
|
|
171
189
|
outputs: [],
|
|
@@ -173,52 +191,157 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
173
191
|
{
|
|
174
192
|
type: 'event_trigger',
|
|
175
193
|
category: 'TRIGGER',
|
|
176
|
-
label: '
|
|
194
|
+
label: '业务事件触发',
|
|
177
195
|
icon: 'ThunderboltOutlined',
|
|
178
|
-
description: '
|
|
196
|
+
description: '业务数据发生变化后自动启动 Workflow',
|
|
179
197
|
configSchema: {
|
|
180
198
|
type: 'object',
|
|
181
199
|
properties: {
|
|
182
|
-
|
|
200
|
+
registrationCode: {
|
|
201
|
+
type: 'string',
|
|
202
|
+
minLength: 1,
|
|
203
|
+
description: '前端登记的 PostgreSQL 表字段监听标识',
|
|
204
|
+
},
|
|
205
|
+
match: {
|
|
206
|
+
type: 'object',
|
|
207
|
+
properties: {
|
|
208
|
+
combineOperation: {
|
|
209
|
+
type: 'string',
|
|
210
|
+
enum: ['AND', 'OR'],
|
|
211
|
+
},
|
|
212
|
+
conditions: {
|
|
213
|
+
type: 'array',
|
|
214
|
+
minItems: 1,
|
|
215
|
+
items: {
|
|
216
|
+
type: 'object',
|
|
217
|
+
properties: {
|
|
218
|
+
id: { type: 'string', minLength: 1 },
|
|
219
|
+
left: {
|
|
220
|
+
type: 'object',
|
|
221
|
+
properties: {
|
|
222
|
+
source: { const: 'WORKFLOW' },
|
|
223
|
+
path: { type: 'string', minLength: 1 },
|
|
224
|
+
},
|
|
225
|
+
required: ['source', 'path'],
|
|
226
|
+
additionalProperties: false,
|
|
227
|
+
},
|
|
228
|
+
operator: {
|
|
229
|
+
type: 'string',
|
|
230
|
+
enum: ['EQ', 'NEQ', 'EMPTY', 'NOT_EMPTY'],
|
|
231
|
+
},
|
|
232
|
+
right: {
|
|
233
|
+
type: 'object',
|
|
234
|
+
properties: {
|
|
235
|
+
source: { const: 'FIXED' },
|
|
236
|
+
valueType: {
|
|
237
|
+
type: 'string',
|
|
238
|
+
enum: ['STRING', 'NUMBER', 'BOOLEAN'],
|
|
239
|
+
},
|
|
240
|
+
value: { type: 'string' },
|
|
241
|
+
},
|
|
242
|
+
required: ['source', 'valueType', 'value'],
|
|
243
|
+
additionalProperties: false,
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
required: ['id', 'left', 'operator'],
|
|
247
|
+
allOf: [
|
|
248
|
+
{
|
|
249
|
+
if: {
|
|
250
|
+
properties: {
|
|
251
|
+
operator: { enum: ['EQ', 'NEQ'] },
|
|
252
|
+
},
|
|
253
|
+
required: ['operator'],
|
|
254
|
+
},
|
|
255
|
+
then: { required: ['right'] },
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
additionalProperties: false,
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
required: ['combineOperation', 'conditions'],
|
|
263
|
+
additionalProperties: false,
|
|
264
|
+
},
|
|
265
|
+
processingMode: {
|
|
183
266
|
type: 'string',
|
|
184
|
-
|
|
267
|
+
enum: ['PARALLEL', 'SERIAL_BY_KEY'],
|
|
268
|
+
default: 'PARALLEL',
|
|
269
|
+
description: '事件的并发处理方式',
|
|
185
270
|
},
|
|
186
|
-
|
|
271
|
+
concurrencyKeyPath: {
|
|
187
272
|
type: 'string',
|
|
188
|
-
|
|
273
|
+
minLength: 1,
|
|
274
|
+
description: '需要保持顺序的业务对象字段',
|
|
275
|
+
},
|
|
276
|
+
maxConcurrency: {
|
|
277
|
+
type: 'integer',
|
|
278
|
+
minimum: 1,
|
|
279
|
+
maximum: 100,
|
|
280
|
+
default: 20,
|
|
281
|
+
description: '顺序调度器最多同时处理的业务对象数量',
|
|
189
282
|
},
|
|
190
283
|
},
|
|
191
|
-
required: ['
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
284
|
+
required: ['registrationCode', 'processingMode'],
|
|
285
|
+
allOf: [
|
|
286
|
+
{
|
|
287
|
+
if: {
|
|
288
|
+
properties: { processingMode: { const: 'SERIAL_BY_KEY' } },
|
|
289
|
+
required: ['processingMode'],
|
|
290
|
+
},
|
|
291
|
+
then: {
|
|
292
|
+
required: ['concurrencyKeyPath', 'maxConcurrency'],
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
additionalProperties: false,
|
|
196
297
|
},
|
|
298
|
+
inputSchema: { description: 'PostgreSQL 行变化的标准 before/after 数据' },
|
|
197
299
|
outputSchema: {
|
|
198
300
|
type: 'object',
|
|
199
|
-
properties: {
|
|
301
|
+
properties: {
|
|
302
|
+
operation: { type: 'string', enum: ['INSERT', 'UPDATE', 'DELETE'] },
|
|
303
|
+
table: {
|
|
304
|
+
type: 'object',
|
|
305
|
+
properties: {
|
|
306
|
+
schema: { type: 'string' },
|
|
307
|
+
name: { type: 'string' },
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
primaryKey: { type: 'object' },
|
|
311
|
+
before: { type: ['object', 'null'] },
|
|
312
|
+
after: { type: ['object', 'null'] },
|
|
313
|
+
changedFields: { type: 'array', items: { type: 'string' } },
|
|
314
|
+
},
|
|
315
|
+
required: [
|
|
316
|
+
'operation',
|
|
317
|
+
'table',
|
|
318
|
+
'primaryKey',
|
|
319
|
+
'before',
|
|
320
|
+
'after',
|
|
321
|
+
'changedFields',
|
|
322
|
+
],
|
|
200
323
|
},
|
|
201
324
|
outputs: [],
|
|
202
325
|
},
|
|
203
326
|
{
|
|
204
327
|
type: 'manual_trigger',
|
|
205
328
|
category: 'TRIGGER',
|
|
206
|
-
label: '
|
|
329
|
+
label: '手动触发',
|
|
207
330
|
icon: 'PlayCircleOutlined',
|
|
208
|
-
description: '
|
|
331
|
+
description: '由用户手动启动 Workflow,适合测试或一次性执行',
|
|
209
332
|
configSchema: {
|
|
210
333
|
type: 'object',
|
|
211
334
|
properties: {
|
|
212
335
|
inputSchema: {
|
|
213
336
|
type: 'object',
|
|
214
|
-
description: '
|
|
337
|
+
description: '手动运行时需要填写的启动参数',
|
|
215
338
|
},
|
|
216
339
|
},
|
|
217
340
|
required: [],
|
|
218
341
|
},
|
|
219
|
-
inputSchema: {
|
|
342
|
+
inputSchema: { description: '手动触发节点没有上一个节点输入' },
|
|
220
343
|
outputSchema: {
|
|
221
|
-
description: '
|
|
344
|
+
description: '用户手动启动时提供的数据',
|
|
222
345
|
},
|
|
223
346
|
outputs: [],
|
|
224
347
|
},
|
|
@@ -227,20 +350,20 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
227
350
|
{
|
|
228
351
|
type: 'http_request',
|
|
229
352
|
category: 'ACTION',
|
|
230
|
-
label: 'HTTP
|
|
353
|
+
label: 'HTTP 请求',
|
|
231
354
|
icon: 'GlobalOutlined',
|
|
232
|
-
description: '
|
|
355
|
+
description: '通过已注册的连接调用外部 HTTP 接口',
|
|
233
356
|
configSchema: {
|
|
234
357
|
type: 'object',
|
|
235
358
|
properties: {
|
|
236
359
|
connectionRef: {
|
|
237
360
|
type: 'string',
|
|
238
|
-
description: '
|
|
361
|
+
description: '要使用的连接编码',
|
|
239
362
|
},
|
|
240
363
|
method: {
|
|
241
364
|
type: 'string',
|
|
242
365
|
enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'],
|
|
243
|
-
description: 'HTTP
|
|
366
|
+
description: 'HTTP 请求方法',
|
|
244
367
|
},
|
|
245
368
|
path: {
|
|
246
369
|
type: 'string',
|
|
@@ -248,39 +371,32 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
248
371
|
'Relative API path. Supports explicit {{input.path}} and {{workflow.path}} references.',
|
|
249
372
|
},
|
|
250
373
|
queryBindings: {
|
|
251
|
-
...
|
|
252
|
-
description: '
|
|
374
|
+
...HTTP_PARAMETER_BINDINGS_SCHEMA,
|
|
375
|
+
description: 'URL 查询参数及其取值来源',
|
|
253
376
|
},
|
|
254
377
|
headerBindings: {
|
|
255
|
-
...
|
|
256
|
-
description: '
|
|
378
|
+
...HTTP_PARAMETER_BINDINGS_SCHEMA,
|
|
379
|
+
description: '请求头及其取值来源',
|
|
257
380
|
},
|
|
258
381
|
bodyMode: {
|
|
259
382
|
type: 'string',
|
|
260
383
|
enum: ['FIELDS', 'JSON'],
|
|
261
|
-
description: '
|
|
384
|
+
description: '请求体编辑方式',
|
|
262
385
|
},
|
|
263
386
|
bodyBindings: {
|
|
264
|
-
...
|
|
265
|
-
description: '
|
|
387
|
+
...HTTP_PARAMETER_BINDINGS_SCHEMA,
|
|
388
|
+
description: '请求体字段及其取值来源',
|
|
266
389
|
},
|
|
267
390
|
body: {
|
|
268
391
|
description:
|
|
269
|
-
'
|
|
392
|
+
'高级 JSON 请求体,可明确引用上一个节点结果或 Workflow 启动数据',
|
|
270
393
|
},
|
|
271
394
|
timeoutSeconds: {
|
|
272
395
|
type: 'integer',
|
|
273
396
|
minimum: 1,
|
|
274
397
|
maximum: 300,
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
retryOnFail: { type: 'boolean', description: 'Retry on failure' },
|
|
278
|
-
maxRetries: { type: 'integer', minimum: 0, maximum: 10 },
|
|
279
|
-
retryInterval: {
|
|
280
|
-
type: 'integer',
|
|
281
|
-
minimum: 0,
|
|
282
|
-
maximum: 60000,
|
|
283
|
-
description: 'Interval between retries in milliseconds',
|
|
398
|
+
default: 30,
|
|
399
|
+
description: '请求超时时间(秒)',
|
|
284
400
|
},
|
|
285
401
|
},
|
|
286
402
|
required: ['connectionRef', 'method', 'path', 'bodyMode'],
|
|
@@ -291,89 +407,51 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
291
407
|
type: 'object',
|
|
292
408
|
properties: {
|
|
293
409
|
status: { type: 'number' },
|
|
294
|
-
data: { description: '
|
|
410
|
+
data: { description: '响应体原始内容' },
|
|
295
411
|
headers: { type: 'object' },
|
|
296
412
|
},
|
|
297
413
|
},
|
|
298
414
|
outputs: [],
|
|
299
415
|
},
|
|
300
|
-
{
|
|
301
|
-
type: 'db_query',
|
|
302
|
-
category: 'ACTION',
|
|
303
|
-
label: 'Database Query',
|
|
304
|
-
icon: 'DatabaseOutlined',
|
|
305
|
-
description: 'Execute a database read query (SELECT)',
|
|
306
|
-
configSchema: {
|
|
307
|
-
type: 'object',
|
|
308
|
-
properties: {
|
|
309
|
-
query: { type: 'string', description: 'SQL statement' },
|
|
310
|
-
params: {
|
|
311
|
-
type: 'array',
|
|
312
|
-
items: { type: 'string' },
|
|
313
|
-
description: 'Parameterized values ($1, $2...)',
|
|
314
|
-
},
|
|
315
|
-
datasource: {
|
|
316
|
-
type: 'string',
|
|
317
|
-
description: 'Database connection identifier',
|
|
318
|
-
},
|
|
319
|
-
timeout: {
|
|
320
|
-
type: 'number',
|
|
321
|
-
description: 'Query timeout in milliseconds',
|
|
322
|
-
},
|
|
323
|
-
},
|
|
324
|
-
required: ['query'],
|
|
325
|
-
},
|
|
326
|
-
inputSchema: { type: 'object', properties: {} },
|
|
327
|
-
outputSchema: {
|
|
328
|
-
type: 'object',
|
|
329
|
-
properties: { rows: { type: 'array' }, rowCount: { type: 'number' } },
|
|
330
|
-
},
|
|
331
|
-
outputs: [],
|
|
332
|
-
},
|
|
333
416
|
{
|
|
334
417
|
type: 'db_execute',
|
|
335
418
|
category: 'ACTION',
|
|
336
|
-
label: '
|
|
419
|
+
label: '数据库操作',
|
|
337
420
|
icon: 'ConsoleSqlOutlined',
|
|
338
|
-
description: '
|
|
421
|
+
description: '使用 SQL 查询或修改当前服务注册的数据库',
|
|
339
422
|
configSchema: {
|
|
340
423
|
type: 'object',
|
|
341
424
|
properties: {
|
|
342
|
-
|
|
343
|
-
type: '
|
|
344
|
-
|
|
345
|
-
description: 'Write operation type',
|
|
425
|
+
allowWrite: {
|
|
426
|
+
type: 'boolean',
|
|
427
|
+
description: '是否允许新增、更新或删除数据',
|
|
346
428
|
},
|
|
347
|
-
|
|
348
|
-
data: { type: 'object', description: 'Data to insert/update (JSON)' },
|
|
349
|
-
where: {
|
|
429
|
+
sql: {
|
|
350
430
|
type: 'string',
|
|
351
|
-
|
|
431
|
+
minLength: 1,
|
|
432
|
+
description: '要执行的单条 SQL',
|
|
352
433
|
},
|
|
353
|
-
|
|
354
|
-
type: 'string',
|
|
355
|
-
description: 'Raw SQL for complex writes (when operation=raw)',
|
|
356
|
-
},
|
|
357
|
-
params: {
|
|
434
|
+
parameters: {
|
|
358
435
|
type: 'array',
|
|
359
|
-
items:
|
|
360
|
-
description: '
|
|
361
|
-
},
|
|
362
|
-
datasource: {
|
|
363
|
-
type: 'string',
|
|
364
|
-
description: 'Database connection identifier',
|
|
436
|
+
items: PARAMETER_BINDING_SCHEMA,
|
|
437
|
+
description: 'SQL 中参数占位符对应的值',
|
|
365
438
|
},
|
|
366
|
-
|
|
367
|
-
type: '
|
|
368
|
-
|
|
439
|
+
timeoutSeconds: {
|
|
440
|
+
type: 'integer',
|
|
441
|
+
minimum: 1,
|
|
442
|
+
maximum: 300,
|
|
443
|
+
description: '执行超时时间(秒)',
|
|
369
444
|
},
|
|
370
445
|
},
|
|
371
|
-
required: ['
|
|
446
|
+
required: ['allowWrite', 'sql'],
|
|
447
|
+
additionalProperties: false,
|
|
372
448
|
},
|
|
373
|
-
inputSchema: {
|
|
449
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
374
450
|
outputSchema: {
|
|
375
451
|
type: 'object',
|
|
376
452
|
properties: {
|
|
453
|
+
rows: { type: 'array' },
|
|
454
|
+
rowCount: { type: 'number' },
|
|
377
455
|
affectedRows: { type: 'number' },
|
|
378
456
|
insertedId: { type: 'string' },
|
|
379
457
|
},
|
|
@@ -383,32 +461,32 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
383
461
|
{
|
|
384
462
|
type: 'code',
|
|
385
463
|
category: 'ACTION',
|
|
386
|
-
label: '
|
|
464
|
+
label: '代码处理',
|
|
387
465
|
icon: 'CodeOutlined',
|
|
388
|
-
description: '
|
|
466
|
+
description: '使用 JavaScript 处理或转换上一个节点的结果',
|
|
389
467
|
configSchema: {
|
|
390
468
|
type: 'object',
|
|
391
469
|
properties: {
|
|
392
|
-
script: { type: 'string', description: 'JavaScript
|
|
470
|
+
script: { type: 'string', description: '要执行的 JavaScript 代码' },
|
|
393
471
|
mode: {
|
|
394
472
|
type: 'string',
|
|
395
|
-
enum: ['runOnceForAll'
|
|
396
|
-
|
|
473
|
+
enum: ['runOnceForAll'],
|
|
474
|
+
default: 'runOnceForAll',
|
|
475
|
+
description: '对完整输入执行一次',
|
|
397
476
|
},
|
|
398
477
|
timeout: {
|
|
399
|
-
type: '
|
|
400
|
-
|
|
478
|
+
type: 'integer',
|
|
479
|
+
minimum: 1,
|
|
480
|
+
maximum: 5000,
|
|
481
|
+
default: 5000,
|
|
482
|
+
description: '代码执行超时时间(毫秒)',
|
|
401
483
|
},
|
|
402
484
|
},
|
|
403
485
|
required: ['script'],
|
|
404
486
|
},
|
|
405
|
-
inputSchema: {
|
|
406
|
-
type: 'object',
|
|
407
|
-
properties: { data: { type: 'object' }, items: { type: 'array' } },
|
|
408
|
-
},
|
|
487
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
409
488
|
outputSchema: {
|
|
410
|
-
|
|
411
|
-
properties: { result: { type: 'object' } },
|
|
489
|
+
description: '代码中 return 的完整结果',
|
|
412
490
|
},
|
|
413
491
|
outputs: [],
|
|
414
492
|
},
|
|
@@ -417,71 +495,105 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
417
495
|
{
|
|
418
496
|
type: 'if_else',
|
|
419
497
|
category: 'CONDITION',
|
|
420
|
-
label: '
|
|
498
|
+
label: '条件分支',
|
|
421
499
|
icon: 'BranchesOutlined',
|
|
422
|
-
description: '
|
|
500
|
+
description: '根据一个或多个条件选择满足或不满足分支',
|
|
423
501
|
configSchema: {
|
|
424
502
|
type: 'object',
|
|
425
503
|
properties: {
|
|
426
504
|
conditions: {
|
|
427
505
|
type: 'array',
|
|
506
|
+
minItems: 1,
|
|
428
507
|
items: {
|
|
429
508
|
type: 'object',
|
|
430
509
|
properties: {
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
510
|
+
id: { type: 'string', minLength: 1 },
|
|
511
|
+
left: PARAMETER_BINDING_SCHEMA,
|
|
512
|
+
operator: {
|
|
513
|
+
type: 'string',
|
|
514
|
+
enum: [
|
|
515
|
+
'EQ',
|
|
516
|
+
'NEQ',
|
|
517
|
+
'GT',
|
|
518
|
+
'GTE',
|
|
519
|
+
'LT',
|
|
520
|
+
'LTE',
|
|
521
|
+
'CONTAINS',
|
|
522
|
+
'NOT_CONTAINS',
|
|
523
|
+
'EMPTY',
|
|
524
|
+
'NOT_EMPTY',
|
|
525
|
+
],
|
|
526
|
+
},
|
|
527
|
+
right: PARAMETER_BINDING_SCHEMA,
|
|
434
528
|
},
|
|
529
|
+
required: ['id', 'left', 'operator'],
|
|
530
|
+
allOf: [
|
|
531
|
+
{
|
|
532
|
+
if: {
|
|
533
|
+
properties: {
|
|
534
|
+
operator: { enum: ['EMPTY', 'NOT_EMPTY'] },
|
|
535
|
+
},
|
|
536
|
+
required: ['operator'],
|
|
537
|
+
},
|
|
538
|
+
then: {},
|
|
539
|
+
else: { required: ['right'] },
|
|
540
|
+
},
|
|
541
|
+
],
|
|
542
|
+
additionalProperties: false,
|
|
435
543
|
},
|
|
436
|
-
description: '
|
|
544
|
+
description: '使用结构化数据来源配置的判断条件',
|
|
437
545
|
},
|
|
438
546
|
combineOperation: {
|
|
439
547
|
type: 'string',
|
|
440
548
|
enum: ['AND', 'OR'],
|
|
441
|
-
description: '
|
|
549
|
+
description: '多个条件之间使用并且或或者',
|
|
442
550
|
},
|
|
443
551
|
},
|
|
444
|
-
required: [],
|
|
552
|
+
required: ['conditions', 'combineOperation'],
|
|
553
|
+
additionalProperties: false,
|
|
445
554
|
},
|
|
446
|
-
inputSchema: {
|
|
555
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
447
556
|
outputSchema: {
|
|
448
|
-
|
|
449
|
-
properties: { branch: { type: 'string', enum: ['true', 'false'] } },
|
|
557
|
+
description: '原样传递上一个节点的完整结果',
|
|
450
558
|
},
|
|
451
559
|
outputs: ['true', 'false'],
|
|
452
560
|
},
|
|
453
561
|
{
|
|
454
562
|
type: 'switch',
|
|
455
563
|
category: 'CONDITION',
|
|
456
|
-
label: '
|
|
564
|
+
label: '多路分支',
|
|
457
565
|
icon: 'PartitionOutlined',
|
|
458
|
-
description: '
|
|
566
|
+
description: '根据一个字段值匹配多个分支,未匹配时进入其他情况',
|
|
459
567
|
configSchema: {
|
|
460
568
|
type: 'object',
|
|
461
569
|
properties: {
|
|
462
|
-
|
|
570
|
+
valueBinding: PARAMETER_BINDING_SCHEMA,
|
|
463
571
|
cases: {
|
|
464
572
|
type: 'array',
|
|
573
|
+
minItems: 1,
|
|
465
574
|
items: {
|
|
466
575
|
type: 'object',
|
|
467
576
|
properties: {
|
|
577
|
+
id: { type: 'string', minLength: 1, not: { const: 'default' } },
|
|
468
578
|
value: { type: 'string' },
|
|
469
|
-
|
|
579
|
+
valueType: {
|
|
580
|
+
type: 'string',
|
|
581
|
+
enum: ['STRING', 'NUMBER', 'BOOLEAN'],
|
|
582
|
+
},
|
|
583
|
+
label: { type: 'string', minLength: 1 },
|
|
470
584
|
},
|
|
585
|
+
required: ['id', 'value', 'valueType', 'label'],
|
|
586
|
+
additionalProperties: false,
|
|
471
587
|
},
|
|
472
|
-
description: '
|
|
473
|
-
},
|
|
474
|
-
defaultCase: {
|
|
475
|
-
type: 'string',
|
|
476
|
-
description: 'Default branch label when no case matches',
|
|
588
|
+
description: '多路匹配项;稳定标识用于保持画布连线',
|
|
477
589
|
},
|
|
478
590
|
},
|
|
479
|
-
required: ['
|
|
591
|
+
required: ['valueBinding', 'cases'],
|
|
592
|
+
additionalProperties: false,
|
|
480
593
|
},
|
|
481
|
-
inputSchema: {
|
|
594
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
482
595
|
outputSchema: {
|
|
483
|
-
|
|
484
|
-
properties: { matchedCase: { type: 'string' } },
|
|
596
|
+
description: '原样传递上一个节点的完整结果',
|
|
485
597
|
},
|
|
486
598
|
outputs: null,
|
|
487
599
|
},
|
|
@@ -490,38 +602,84 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
490
602
|
{
|
|
491
603
|
type: 'for_each',
|
|
492
604
|
category: 'FLOW_CONTROL',
|
|
493
|
-
label: '
|
|
605
|
+
label: '循环处理',
|
|
494
606
|
icon: 'RetweetOutlined',
|
|
495
|
-
description: '
|
|
607
|
+
description: '逐项处理数组数据,并在全部完成后继续流程',
|
|
496
608
|
configSchema: {
|
|
497
609
|
type: 'object',
|
|
498
610
|
properties: {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
611
|
+
itemsBinding: PARAMETER_BINDING_SCHEMA,
|
|
612
|
+
execution: {
|
|
613
|
+
type: 'object',
|
|
614
|
+
properties: {
|
|
615
|
+
mode: {
|
|
616
|
+
type: 'string',
|
|
617
|
+
enum: ['SEQUENTIAL', 'PARALLEL'],
|
|
618
|
+
default: 'SEQUENTIAL',
|
|
619
|
+
},
|
|
620
|
+
concurrency: {
|
|
621
|
+
type: 'integer',
|
|
622
|
+
minimum: 2,
|
|
623
|
+
maximum: 20,
|
|
624
|
+
default: 3,
|
|
625
|
+
},
|
|
626
|
+
},
|
|
627
|
+
required: ['mode'],
|
|
628
|
+
allOf: [
|
|
629
|
+
{
|
|
630
|
+
if: {
|
|
631
|
+
properties: { mode: { const: 'PARALLEL' } },
|
|
632
|
+
required: ['mode'],
|
|
633
|
+
},
|
|
634
|
+
then: { required: ['concurrency'] },
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
if: {
|
|
638
|
+
properties: { mode: { const: 'SEQUENTIAL' } },
|
|
639
|
+
required: ['mode'],
|
|
640
|
+
},
|
|
641
|
+
then: { not: { required: ['concurrency'] } },
|
|
642
|
+
},
|
|
643
|
+
],
|
|
644
|
+
additionalProperties: false,
|
|
506
645
|
},
|
|
507
646
|
errorPolicy: {
|
|
508
647
|
type: 'string',
|
|
509
|
-
enum: ['
|
|
510
|
-
|
|
511
|
-
'Behavior on item failure: stop all, continue, or collect errors',
|
|
648
|
+
enum: ['STOP', 'CONTINUE'],
|
|
649
|
+
default: 'STOP',
|
|
512
650
|
},
|
|
513
651
|
},
|
|
514
|
-
required: ['
|
|
652
|
+
required: ['itemsBinding', 'execution', 'errorPolicy'],
|
|
653
|
+
additionalProperties: false,
|
|
515
654
|
},
|
|
516
|
-
inputSchema: {
|
|
655
|
+
inputSchema: { description: '包含待循环数组的上一个节点结果' },
|
|
517
656
|
outputSchema: {
|
|
518
657
|
type: 'object',
|
|
519
658
|
properties: {
|
|
520
|
-
results: {
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
659
|
+
results: {
|
|
660
|
+
type: 'array',
|
|
661
|
+
items: {
|
|
662
|
+
type: 'object',
|
|
663
|
+
properties: {
|
|
664
|
+
index: { type: 'number' },
|
|
665
|
+
status: {
|
|
666
|
+
type: 'string',
|
|
667
|
+
enum: ['SUCCEEDED', 'FAILED'],
|
|
668
|
+
},
|
|
669
|
+
output: {},
|
|
670
|
+
error: {
|
|
671
|
+
type: 'object',
|
|
672
|
+
properties: { message: { type: 'string' } },
|
|
673
|
+
},
|
|
674
|
+
},
|
|
675
|
+
required: ['index', 'status'],
|
|
676
|
+
},
|
|
677
|
+
},
|
|
678
|
+
total: { type: 'number' },
|
|
679
|
+
succeeded: { type: 'number' },
|
|
680
|
+
failed: { type: 'number' },
|
|
524
681
|
},
|
|
682
|
+
required: ['results', 'total', 'succeeded', 'failed'],
|
|
525
683
|
},
|
|
526
684
|
outputs: [],
|
|
527
685
|
},
|
|
@@ -530,69 +688,89 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
530
688
|
category: 'FLOW_CONTROL',
|
|
531
689
|
label: '定时等待',
|
|
532
690
|
icon: 'HourglassOutlined',
|
|
533
|
-
description:
|
|
534
|
-
'Pause workflow execution for a specified duration (Temporal Timer)',
|
|
691
|
+
description: '等待一段时间或等待到指定时间后继续执行',
|
|
535
692
|
configSchema: {
|
|
536
693
|
type: 'object',
|
|
537
694
|
properties: {
|
|
538
|
-
|
|
695
|
+
mode: {
|
|
539
696
|
type: 'string',
|
|
540
|
-
enum: ['
|
|
541
|
-
description: '
|
|
697
|
+
enum: ['DURATION', 'UNTIL'],
|
|
698
|
+
description: '等待一段时间或等待到指定时间',
|
|
542
699
|
},
|
|
543
700
|
duration: {
|
|
544
|
-
type: '
|
|
545
|
-
|
|
701
|
+
type: 'object',
|
|
702
|
+
properties: {
|
|
703
|
+
value: { type: 'integer', minimum: 1 },
|
|
704
|
+
unit: {
|
|
705
|
+
type: 'string',
|
|
706
|
+
enum: ['SECONDS', 'MINUTES', 'HOURS', 'DAYS'],
|
|
707
|
+
},
|
|
708
|
+
},
|
|
709
|
+
required: ['value', 'unit'],
|
|
710
|
+
additionalProperties: false,
|
|
546
711
|
},
|
|
547
712
|
untilTime: {
|
|
548
713
|
type: 'string',
|
|
549
|
-
|
|
714
|
+
format: 'date-time',
|
|
715
|
+
description: '恢复执行的时间',
|
|
550
716
|
},
|
|
551
717
|
},
|
|
552
|
-
required: ['
|
|
718
|
+
required: ['mode'],
|
|
719
|
+
allOf: [
|
|
720
|
+
{
|
|
721
|
+
if: { properties: { mode: { const: 'DURATION' } } },
|
|
722
|
+
then: { required: ['duration'] },
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
if: { properties: { mode: { const: 'UNTIL' } } },
|
|
726
|
+
then: { required: ['untilTime'] },
|
|
727
|
+
},
|
|
728
|
+
],
|
|
729
|
+
additionalProperties: false,
|
|
553
730
|
},
|
|
554
|
-
inputSchema: {
|
|
731
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
555
732
|
outputSchema: {
|
|
556
|
-
|
|
557
|
-
properties: {
|
|
558
|
-
resumedAt: { type: 'string' },
|
|
559
|
-
resumeReason: { type: 'string' },
|
|
560
|
-
},
|
|
733
|
+
description: '原样传递上一个节点的完整结果',
|
|
561
734
|
},
|
|
562
735
|
outputs: [],
|
|
563
736
|
},
|
|
564
737
|
{
|
|
565
738
|
type: 'parallel',
|
|
566
739
|
category: 'FLOW_CONTROL',
|
|
567
|
-
label: '
|
|
740
|
+
label: '并行执行',
|
|
568
741
|
icon: 'ForkOutlined',
|
|
569
|
-
description:
|
|
570
|
-
'Execute multiple branches in parallel and wait for all to complete',
|
|
742
|
+
description: '同时执行画布连接的多个分支',
|
|
571
743
|
configSchema: {
|
|
572
744
|
type: 'object',
|
|
573
745
|
properties: {
|
|
574
746
|
branches: {
|
|
575
747
|
type: 'array',
|
|
748
|
+
minItems: 2,
|
|
576
749
|
items: {
|
|
577
750
|
type: 'object',
|
|
578
751
|
properties: {
|
|
579
|
-
|
|
752
|
+
id: { type: 'string', minLength: 1 },
|
|
753
|
+
label: { type: 'string', minLength: 1 },
|
|
580
754
|
},
|
|
755
|
+
required: ['id', 'label'],
|
|
756
|
+
additionalProperties: false,
|
|
581
757
|
},
|
|
582
|
-
description: 'Named parallel branches',
|
|
583
|
-
},
|
|
584
|
-
waitMode: {
|
|
585
|
-
type: 'string',
|
|
586
|
-
enum: ['all', 'any'],
|
|
587
|
-
description: 'Wait for all branches or any one branch to complete',
|
|
588
758
|
},
|
|
589
759
|
},
|
|
590
760
|
required: ['branches'],
|
|
761
|
+
additionalProperties: false,
|
|
591
762
|
},
|
|
592
|
-
inputSchema: {
|
|
763
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
593
764
|
outputSchema: {
|
|
594
765
|
type: 'object',
|
|
595
|
-
properties: {
|
|
766
|
+
properties: {
|
|
767
|
+
branch: {
|
|
768
|
+
type: 'array',
|
|
769
|
+
description: '按分支配置顺序汇总的最终结果,数组索引从 0 开始',
|
|
770
|
+
items: {},
|
|
771
|
+
},
|
|
772
|
+
},
|
|
773
|
+
required: ['branch'],
|
|
596
774
|
},
|
|
597
775
|
outputs: [],
|
|
598
776
|
},
|
|
@@ -602,9 +780,9 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
|
|
|
602
780
|
const approvalDefinition: BaseNodeTypeSeed = {
|
|
603
781
|
type: 'approval',
|
|
604
782
|
category: 'APPROVAL',
|
|
605
|
-
label: '
|
|
783
|
+
label: '人工审批',
|
|
606
784
|
icon: 'CheckCircleOutlined',
|
|
607
|
-
description: '
|
|
785
|
+
description: '创建审批请求并等待审批人通过、拒绝或超时',
|
|
608
786
|
configSchema: {
|
|
609
787
|
type: 'object',
|
|
610
788
|
properties: {
|
|
@@ -618,54 +796,61 @@ const approvalDefinition: BaseNodeTypeSeed = {
|
|
|
618
796
|
},
|
|
619
797
|
required: ['type', 'id'],
|
|
620
798
|
},
|
|
621
|
-
description:
|
|
622
|
-
'Approvers — mix of individual users (type=user, id=userid) and reusable groups (type=group, id=UserGroup.code)',
|
|
799
|
+
description: '可以处理本次审批的用户或可复用用户组',
|
|
623
800
|
},
|
|
624
801
|
approvalMode: {
|
|
625
802
|
type: 'string',
|
|
626
803
|
enum: ['any', 'all', 'percentage'],
|
|
627
|
-
description: '
|
|
804
|
+
description: '任意一人、全部通过或达到指定比例',
|
|
628
805
|
},
|
|
629
806
|
minApprovalCount: {
|
|
630
807
|
type: 'number',
|
|
631
|
-
description: '
|
|
808
|
+
description: '达到通过条件所需的最少人数',
|
|
632
809
|
},
|
|
633
|
-
timeout: { type: 'number', description: '
|
|
810
|
+
timeout: { type: 'number', description: '审批超时时间(秒)' },
|
|
634
811
|
timeoutAction: {
|
|
635
812
|
type: 'string',
|
|
636
813
|
enum: ['auto_approve', 'auto_reject', 'escalate'],
|
|
637
|
-
description: '
|
|
814
|
+
description: '审批超时后的处理动作',
|
|
638
815
|
},
|
|
639
816
|
escalateTo: {
|
|
640
817
|
type: 'array',
|
|
641
818
|
items: { type: 'string' },
|
|
642
|
-
description: '
|
|
819
|
+
description: '审批超时后的升级处理人',
|
|
643
820
|
},
|
|
644
821
|
reminderInterval: {
|
|
645
822
|
type: 'number',
|
|
646
|
-
description: '
|
|
823
|
+
description: '提醒间隔(小时),0 表示不提醒',
|
|
647
824
|
},
|
|
648
825
|
allowDelegate: {
|
|
649
826
|
type: 'boolean',
|
|
650
|
-
description: '
|
|
827
|
+
description: '是否允许审批人转交给其他人',
|
|
651
828
|
},
|
|
652
829
|
},
|
|
653
830
|
required: ['approvers'],
|
|
654
831
|
},
|
|
655
|
-
inputSchema: {
|
|
656
|
-
type: 'object',
|
|
657
|
-
properties: { requestData: { type: 'object' } },
|
|
658
|
-
},
|
|
832
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
659
833
|
outputSchema: {
|
|
660
834
|
type: 'object',
|
|
661
835
|
properties: {
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
836
|
+
previous: {
|
|
837
|
+
description: '进入人工审批前收到的完整数据',
|
|
838
|
+
},
|
|
839
|
+
result: {
|
|
840
|
+
type: 'object',
|
|
841
|
+
properties: {
|
|
842
|
+
requestId: { type: 'string' },
|
|
843
|
+
result: {
|
|
844
|
+
type: 'string',
|
|
845
|
+
enum: ['APPROVED', 'REJECTED'],
|
|
846
|
+
},
|
|
847
|
+
reason: { type: 'string' },
|
|
848
|
+
decidedAt: { type: 'string' },
|
|
849
|
+
approved: { type: 'boolean' },
|
|
850
|
+
},
|
|
851
|
+
},
|
|
668
852
|
},
|
|
853
|
+
required: ['previous', 'result'],
|
|
669
854
|
},
|
|
670
855
|
outputs: [],
|
|
671
856
|
};
|
|
@@ -682,63 +867,136 @@ const subWorkflowDefinition: BaseNodeTypeSeed = {
|
|
|
682
867
|
properties: {
|
|
683
868
|
workflowId: {
|
|
684
869
|
type: 'string',
|
|
685
|
-
description: '
|
|
870
|
+
description: '要调用的 Workflow ID',
|
|
871
|
+
},
|
|
872
|
+
workflowVersionId: {
|
|
873
|
+
type: 'string',
|
|
874
|
+
description: '要调用的 Workflow 版本 ID',
|
|
686
875
|
},
|
|
687
876
|
inputBindings: {
|
|
688
877
|
...PARAMETER_BINDINGS_SCHEMA,
|
|
689
|
-
description:
|
|
690
|
-
'Bind child inputs to the previous node, Workflow data, or fixed values',
|
|
878
|
+
description: '从上一个节点的结果、Workflow 启动数据或固定值传入参数',
|
|
691
879
|
},
|
|
692
880
|
},
|
|
693
|
-
required: ['workflowId'],
|
|
881
|
+
required: ['workflowId', 'workflowVersionId'],
|
|
882
|
+
additionalProperties: false,
|
|
694
883
|
},
|
|
695
|
-
inputSchema: {
|
|
884
|
+
inputSchema: { description: '上一个节点的完整结果' },
|
|
696
885
|
outputSchema: {
|
|
697
|
-
description: '
|
|
886
|
+
description: '被调用 Workflow 返回的完整结果',
|
|
698
887
|
},
|
|
699
888
|
outputs: [],
|
|
700
889
|
};
|
|
701
890
|
|
|
702
|
-
const
|
|
891
|
+
const HTTP_REQUEST_CONFIG_SCHEMA = NODE_DEFINITIONS.find(
|
|
892
|
+
(definition) => definition.type === 'http_request',
|
|
893
|
+
)!.configSchema as any;
|
|
894
|
+
|
|
895
|
+
const APPROVAL_HTTP_REQUEST_CONFIG_SCHEMA = {
|
|
896
|
+
...HTTP_REQUEST_CONFIG_SCHEMA,
|
|
897
|
+
properties: {
|
|
898
|
+
...HTTP_REQUEST_CONFIG_SCHEMA.properties,
|
|
899
|
+
queryBindings: {
|
|
900
|
+
...HTTP_REQUEST_CONFIG_SCHEMA.properties.queryBindings,
|
|
901
|
+
additionalProperties: APPROVAL_PARAMETER_BINDING_SCHEMA,
|
|
902
|
+
},
|
|
903
|
+
headerBindings: {
|
|
904
|
+
...HTTP_REQUEST_CONFIG_SCHEMA.properties.headerBindings,
|
|
905
|
+
additionalProperties: APPROVAL_PARAMETER_BINDING_SCHEMA,
|
|
906
|
+
},
|
|
907
|
+
bodyBindings: {
|
|
908
|
+
...HTTP_REQUEST_CONFIG_SCHEMA.properties.bodyBindings,
|
|
909
|
+
additionalProperties: APPROVAL_PARAMETER_BINDING_SCHEMA,
|
|
910
|
+
},
|
|
911
|
+
},
|
|
912
|
+
};
|
|
913
|
+
|
|
914
|
+
const EMBEDDED_CODE_CONFIG_SCHEMA = {
|
|
703
915
|
type: 'object',
|
|
704
916
|
properties: {
|
|
705
|
-
|
|
917
|
+
script: { type: 'string', minLength: 1 },
|
|
918
|
+
mode: {
|
|
706
919
|
type: 'string',
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
'Optional callable Workflow that dispatches the request, waits for the external result, and returns the decision.',
|
|
920
|
+
enum: ['runOnceForAll'],
|
|
921
|
+
default: 'runOnceForAll',
|
|
710
922
|
},
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
923
|
+
timeout: {
|
|
924
|
+
type: 'integer',
|
|
925
|
+
minimum: 1,
|
|
926
|
+
maximum: 5000,
|
|
927
|
+
default: 5000,
|
|
716
928
|
},
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
929
|
+
},
|
|
930
|
+
required: ['script'],
|
|
931
|
+
additionalProperties: false,
|
|
932
|
+
};
|
|
933
|
+
|
|
934
|
+
const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
|
|
935
|
+
type: 'object',
|
|
936
|
+
properties: {
|
|
937
|
+
external: {
|
|
938
|
+
type: 'object',
|
|
939
|
+
title: '外部审批',
|
|
940
|
+
properties: {
|
|
941
|
+
request: APPROVAL_HTTP_REQUEST_CONFIG_SCHEMA,
|
|
942
|
+
creationResult: EMBEDDED_CODE_CONFIG_SCHEMA,
|
|
943
|
+
callbackResult: EMBEDDED_CODE_CONFIG_SCHEMA,
|
|
944
|
+
},
|
|
945
|
+
required: ['request', 'creationResult', 'callbackResult'],
|
|
946
|
+
additionalProperties: false,
|
|
947
|
+
},
|
|
948
|
+
task: {
|
|
949
|
+
type: 'object',
|
|
950
|
+
title: '审批任务',
|
|
951
|
+
properties: {
|
|
952
|
+
title: PARAMETER_BINDING_SCHEMA,
|
|
953
|
+
description: PARAMETER_BINDING_SCHEMA,
|
|
954
|
+
details: {
|
|
955
|
+
type: 'array',
|
|
956
|
+
default: [],
|
|
957
|
+
items: {
|
|
958
|
+
type: 'object',
|
|
959
|
+
properties: {
|
|
960
|
+
key: { type: 'string', minLength: 1 },
|
|
961
|
+
label: { type: 'string', minLength: 1 },
|
|
962
|
+
value: PARAMETER_BINDING_SCHEMA,
|
|
963
|
+
},
|
|
964
|
+
required: ['key', 'label', 'value'],
|
|
965
|
+
additionalProperties: false,
|
|
966
|
+
},
|
|
725
967
|
},
|
|
726
|
-
required: ['workflowId', 'inputBindings'],
|
|
727
968
|
},
|
|
969
|
+
required: ['title', 'description', 'details'],
|
|
970
|
+
additionalProperties: false,
|
|
728
971
|
},
|
|
729
972
|
subjects: {
|
|
730
973
|
type: 'array',
|
|
731
|
-
title: '
|
|
732
|
-
description: '
|
|
733
|
-
minItems:
|
|
974
|
+
title: '审批人',
|
|
975
|
+
description: '可以处理本次审批的用户和可复用用户组',
|
|
976
|
+
minItems: 1,
|
|
977
|
+
default: [],
|
|
734
978
|
'x-gadmin-capability': 'subject-references',
|
|
735
979
|
items: {
|
|
736
980
|
type: 'object',
|
|
737
981
|
properties: {
|
|
738
982
|
source: { type: 'string', enum: ['STATIC', 'DYNAMIC'] },
|
|
739
983
|
provider: { type: 'string', enum: ['USER', 'USER_GROUP'] },
|
|
740
|
-
refs: {
|
|
741
|
-
|
|
984
|
+
refs: {
|
|
985
|
+
type: 'array',
|
|
986
|
+
minItems: 1,
|
|
987
|
+
items: { type: 'string', minLength: 1 },
|
|
988
|
+
},
|
|
989
|
+
inputKey: { type: 'string', minLength: 1 },
|
|
990
|
+
label: { type: 'string', minLength: 1 },
|
|
991
|
+
lookup: {
|
|
992
|
+
type: 'object',
|
|
993
|
+
properties: {
|
|
994
|
+
request: HTTP_REQUEST_CONFIG_SCHEMA,
|
|
995
|
+
result: EMBEDDED_CODE_CONFIG_SCHEMA,
|
|
996
|
+
},
|
|
997
|
+
required: ['request', 'result'],
|
|
998
|
+
additionalProperties: false,
|
|
999
|
+
},
|
|
742
1000
|
},
|
|
743
1001
|
required: ['source', 'provider'],
|
|
744
1002
|
allOf: [
|
|
@@ -748,36 +1006,64 @@ const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
|
|
|
748
1006
|
},
|
|
749
1007
|
{
|
|
750
1008
|
if: { properties: { source: { const: 'DYNAMIC' } } },
|
|
751
|
-
then: { required: ['inputKey'] },
|
|
1009
|
+
then: { required: ['inputKey', 'label', 'lookup'] },
|
|
752
1010
|
},
|
|
753
1011
|
],
|
|
1012
|
+
additionalProperties: false,
|
|
754
1013
|
},
|
|
755
1014
|
},
|
|
756
1015
|
approvalRule: {
|
|
757
1016
|
type: 'object',
|
|
758
|
-
title: '
|
|
1017
|
+
title: '通过规则',
|
|
759
1018
|
properties: {
|
|
760
1019
|
mode: { type: 'string', enum: ['ANY', 'ALL', 'COUNT', 'PERCENTAGE'] },
|
|
761
1020
|
count: { type: 'integer', minimum: 1 },
|
|
762
1021
|
percentage: { type: 'integer', minimum: 1, maximum: 100 },
|
|
763
1022
|
},
|
|
764
1023
|
required: ['mode'],
|
|
1024
|
+
allOf: [
|
|
1025
|
+
{
|
|
1026
|
+
if: { properties: { mode: { const: 'COUNT' } } },
|
|
1027
|
+
then: { required: ['count'] },
|
|
1028
|
+
},
|
|
1029
|
+
{
|
|
1030
|
+
if: { properties: { mode: { const: 'PERCENTAGE' } } },
|
|
1031
|
+
then: { required: ['percentage'] },
|
|
1032
|
+
},
|
|
1033
|
+
],
|
|
1034
|
+
additionalProperties: false,
|
|
765
1035
|
default: { mode: 'ANY' },
|
|
766
1036
|
},
|
|
767
1037
|
rejectionRule: {
|
|
768
1038
|
type: 'object',
|
|
769
|
-
title: '
|
|
1039
|
+
title: '拒绝规则',
|
|
770
1040
|
properties: {
|
|
771
1041
|
mode: { type: 'string', enum: ['ANY', 'ALL', 'COUNT', 'PERCENTAGE'] },
|
|
772
1042
|
count: { type: 'integer', minimum: 1 },
|
|
773
1043
|
percentage: { type: 'integer', minimum: 1, maximum: 100 },
|
|
774
1044
|
},
|
|
775
1045
|
required: ['mode'],
|
|
1046
|
+
allOf: [
|
|
1047
|
+
{
|
|
1048
|
+
if: { properties: { mode: { const: 'COUNT' } } },
|
|
1049
|
+
then: { required: ['count'] },
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
if: { properties: { mode: { const: 'PERCENTAGE' } } },
|
|
1053
|
+
then: { required: ['percentage'] },
|
|
1054
|
+
},
|
|
1055
|
+
],
|
|
1056
|
+
additionalProperties: false,
|
|
776
1057
|
default: { mode: 'ANY' },
|
|
777
1058
|
},
|
|
1059
|
+
blockCancellationOnResolved: {
|
|
1060
|
+
type: 'boolean',
|
|
1061
|
+
title: '审批完成后禁止取消',
|
|
1062
|
+
default: false,
|
|
1063
|
+
},
|
|
778
1064
|
timeout: {
|
|
779
1065
|
type: 'object',
|
|
780
|
-
title: '
|
|
1066
|
+
title: '审批超时',
|
|
781
1067
|
properties: {
|
|
782
1068
|
durationSeconds: {
|
|
783
1069
|
type: 'integer',
|
|
@@ -794,7 +1080,8 @@ const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
|
|
|
794
1080
|
default: { durationSeconds: 0, action: 'REJECTED' },
|
|
795
1081
|
},
|
|
796
1082
|
},
|
|
797
|
-
required: ['subjects', 'approvalRule', 'rejectionRule', 'timeout'],
|
|
1083
|
+
required: ['task', 'subjects', 'approvalRule', 'rejectionRule', 'timeout'],
|
|
1084
|
+
additionalProperties: false,
|
|
798
1085
|
};
|
|
799
1086
|
|
|
800
1087
|
const HUMAN_APPROVAL_UI_SCHEMA: NodeTypeSeed['uiSchema'] = {
|
|
@@ -806,14 +1093,14 @@ const humanApprovalNode: NodeTypeSeed = {
|
|
|
806
1093
|
configSchema: HUMAN_APPROVAL_CONFIG_SCHEMA,
|
|
807
1094
|
outputs: ['true', 'false'],
|
|
808
1095
|
runtimeKey: 'human_approval',
|
|
809
|
-
schemaVersion:
|
|
810
|
-
instancePolicy: '
|
|
1096
|
+
schemaVersion: 20,
|
|
1097
|
+
instancePolicy: 'OPTIONAL',
|
|
811
1098
|
uiSchema: HUMAN_APPROVAL_UI_SCHEMA,
|
|
812
1099
|
};
|
|
813
1100
|
|
|
814
1101
|
const callableTriggerNode: NodeTypeSeed = {
|
|
815
1102
|
type: 'callable_trigger',
|
|
816
|
-
category: '
|
|
1103
|
+
category: 'TRIGGER',
|
|
817
1104
|
label: '接收内部调用',
|
|
818
1105
|
icon: 'ImportOutlined',
|
|
819
1106
|
description: '接收其他地方传入的 Workflow 启动数据',
|
|
@@ -837,12 +1124,12 @@ const callableTriggerNode: NodeTypeSeed = {
|
|
|
837
1124
|
},
|
|
838
1125
|
inputSchema: { type: 'object' },
|
|
839
1126
|
outputSchema: {
|
|
840
|
-
description: 'Workflow
|
|
1127
|
+
description: '调用方传入的 Workflow 启动数据',
|
|
841
1128
|
},
|
|
842
1129
|
outputs: [],
|
|
843
1130
|
runtimeKey: 'callable_trigger',
|
|
844
1131
|
schemaVersion: 2,
|
|
845
|
-
instancePolicy: '
|
|
1132
|
+
instancePolicy: 'OPTIONAL',
|
|
846
1133
|
uiSchema: {
|
|
847
1134
|
fields: {
|
|
848
1135
|
inputParameters: { widget: 'callable-input-parameters' },
|
|
@@ -850,26 +1137,6 @@ const callableTriggerNode: NodeTypeSeed = {
|
|
|
850
1137
|
},
|
|
851
1138
|
};
|
|
852
1139
|
|
|
853
|
-
const returnResultNode: NodeTypeSeed = {
|
|
854
|
-
type: 'return_result',
|
|
855
|
-
category: 'SUB_WORKFLOW',
|
|
856
|
-
label: '返回调用',
|
|
857
|
-
icon: 'ExportOutlined',
|
|
858
|
-
description: '结束当前 Workflow,并把上一个节点的结果返回给调用方',
|
|
859
|
-
configSchema: {
|
|
860
|
-
type: 'object',
|
|
861
|
-
properties: {},
|
|
862
|
-
additionalProperties: false,
|
|
863
|
-
},
|
|
864
|
-
inputSchema: { type: 'object' },
|
|
865
|
-
outputSchema: { type: 'object' },
|
|
866
|
-
outputs: [],
|
|
867
|
-
runtimeKey: 'return_result',
|
|
868
|
-
schemaVersion: 5,
|
|
869
|
-
instancePolicy: 'INLINE_ONLY',
|
|
870
|
-
uiSchema: { widget: 'return-result-config' },
|
|
871
|
-
};
|
|
872
|
-
|
|
873
1140
|
const externalWaitNode: NodeTypeSeed = {
|
|
874
1141
|
type: 'external_wait',
|
|
875
1142
|
category: 'FLOW_CONTROL',
|
|
@@ -891,6 +1158,42 @@ const externalWaitNode: NodeTypeSeed = {
|
|
|
891
1158
|
deadlineBinding: PARAMETER_BINDING_SCHEMA,
|
|
892
1159
|
},
|
|
893
1160
|
required: ['mode'],
|
|
1161
|
+
allOf: [
|
|
1162
|
+
{
|
|
1163
|
+
if: {
|
|
1164
|
+
properties: { mode: { const: 'DURATION' } },
|
|
1165
|
+
required: ['mode'],
|
|
1166
|
+
},
|
|
1167
|
+
then: {
|
|
1168
|
+
required: ['durationSeconds'],
|
|
1169
|
+
not: { required: ['deadlineBinding'] },
|
|
1170
|
+
},
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
if: {
|
|
1174
|
+
properties: { mode: { const: 'DEADLINE' } },
|
|
1175
|
+
required: ['mode'],
|
|
1176
|
+
},
|
|
1177
|
+
then: {
|
|
1178
|
+
required: ['deadlineBinding'],
|
|
1179
|
+
not: { required: ['durationSeconds'] },
|
|
1180
|
+
},
|
|
1181
|
+
},
|
|
1182
|
+
{
|
|
1183
|
+
if: {
|
|
1184
|
+
properties: { mode: { const: 'NONE' } },
|
|
1185
|
+
required: ['mode'],
|
|
1186
|
+
},
|
|
1187
|
+
then: {
|
|
1188
|
+
not: {
|
|
1189
|
+
anyOf: [
|
|
1190
|
+
{ required: ['durationSeconds'] },
|
|
1191
|
+
{ required: ['deadlineBinding'] },
|
|
1192
|
+
],
|
|
1193
|
+
},
|
|
1194
|
+
},
|
|
1195
|
+
},
|
|
1196
|
+
],
|
|
894
1197
|
additionalProperties: false,
|
|
895
1198
|
},
|
|
896
1199
|
},
|
|
@@ -903,48 +1206,56 @@ const externalWaitNode: NodeTypeSeed = {
|
|
|
903
1206
|
outputSchema: {
|
|
904
1207
|
type: 'object',
|
|
905
1208
|
properties: {
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
1209
|
+
previous: {
|
|
1210
|
+
description: '进入等待节点前收到的完整数据',
|
|
1211
|
+
},
|
|
1212
|
+
result: {
|
|
1213
|
+
type: 'object',
|
|
1214
|
+
properties: {
|
|
1215
|
+
callbackToken: { type: 'string' },
|
|
1216
|
+
eventId: { type: 'string' },
|
|
1217
|
+
outcome: { type: 'string' },
|
|
1218
|
+
operatorId: { type: 'string' },
|
|
1219
|
+
data: { type: 'object' },
|
|
1220
|
+
completedAt: { type: 'string' },
|
|
1221
|
+
reason: { type: 'string' },
|
|
1222
|
+
},
|
|
1223
|
+
required: ['callbackToken'],
|
|
1224
|
+
},
|
|
914
1225
|
},
|
|
915
|
-
required: ['
|
|
1226
|
+
required: ['previous', 'result'],
|
|
916
1227
|
},
|
|
917
1228
|
outputs: ['RECEIVED', 'TIMEOUT'],
|
|
918
1229
|
runtimeKey: 'external_wait',
|
|
919
|
-
schemaVersion:
|
|
920
|
-
instancePolicy: '
|
|
1230
|
+
schemaVersion: 6,
|
|
1231
|
+
instancePolicy: 'OPTIONAL',
|
|
921
1232
|
uiSchema: { widget: 'external-wait-config' },
|
|
922
1233
|
};
|
|
923
1234
|
|
|
924
|
-
const httpRequestDefinition =
|
|
1235
|
+
const httpRequestDefinition = NODE_DEFINITIONS.find(
|
|
925
1236
|
(definition) => definition.type === 'http_request',
|
|
926
1237
|
)!;
|
|
927
1238
|
|
|
928
|
-
const webhookDefinition =
|
|
1239
|
+
const webhookDefinition = NODE_DEFINITIONS.find(
|
|
929
1240
|
(definition) => definition.type === 'webhook_trigger',
|
|
930
1241
|
)!;
|
|
931
1242
|
|
|
932
1243
|
const webhookNode: NodeTypeSeed = {
|
|
933
|
-
...
|
|
1244
|
+
...templatableNode(webhookDefinition),
|
|
934
1245
|
runtimeKey: 'webhook_trigger',
|
|
935
|
-
schemaVersion:
|
|
1246
|
+
schemaVersion: 5,
|
|
936
1247
|
uiSchema: { widget: 'external-request-config' },
|
|
937
1248
|
};
|
|
938
1249
|
|
|
939
1250
|
const httpRequestNode: NodeTypeSeed = {
|
|
940
1251
|
...httpRequestDefinition,
|
|
941
1252
|
runtimeKey: 'http_request',
|
|
942
|
-
schemaVersion:
|
|
1253
|
+
schemaVersion: 8,
|
|
943
1254
|
instancePolicy: 'OPTIONAL',
|
|
944
1255
|
uiSchema: { widget: 'http-request-config' },
|
|
945
1256
|
};
|
|
946
1257
|
|
|
947
|
-
const codeDefinition =
|
|
1258
|
+
const codeDefinition = NODE_DEFINITIONS.find(
|
|
948
1259
|
(definition) => definition.type === 'code',
|
|
949
1260
|
)!;
|
|
950
1261
|
|
|
@@ -955,58 +1266,114 @@ const codeNode: NodeTypeSeed = {
|
|
|
955
1266
|
properties: {
|
|
956
1267
|
script: {
|
|
957
1268
|
type: 'string',
|
|
958
|
-
description: 'JavaScript
|
|
1269
|
+
description: 'JavaScript 函数体,通过 return 返回处理结果',
|
|
959
1270
|
default: 'return input;',
|
|
960
1271
|
},
|
|
961
1272
|
mode: {
|
|
962
1273
|
type: 'string',
|
|
963
|
-
enum: ['runOnceForAll'
|
|
1274
|
+
enum: ['runOnceForAll'],
|
|
964
1275
|
default: 'runOnceForAll',
|
|
965
1276
|
},
|
|
966
1277
|
timeout: {
|
|
967
1278
|
type: 'integer',
|
|
968
1279
|
minimum: 1,
|
|
969
1280
|
maximum: 5000,
|
|
970
|
-
default:
|
|
971
|
-
description: '
|
|
1281
|
+
default: 5000,
|
|
1282
|
+
description: '代码执行的最长时间(毫秒)',
|
|
972
1283
|
},
|
|
973
1284
|
},
|
|
974
1285
|
required: ['script'],
|
|
975
1286
|
},
|
|
976
|
-
inputSchema: { description: '
|
|
1287
|
+
inputSchema: { description: '上一个节点返回的任意 JSON 值' },
|
|
977
1288
|
outputSchema: {
|
|
978
|
-
description: '
|
|
1289
|
+
description: '代码通过 return 返回的任意 JSON 值',
|
|
979
1290
|
},
|
|
980
1291
|
runtimeKey: 'code',
|
|
981
|
-
schemaVersion:
|
|
1292
|
+
schemaVersion: 6,
|
|
982
1293
|
instancePolicy: 'OPTIONAL',
|
|
983
1294
|
uiSchema: { widget: 'code-config' },
|
|
984
1295
|
};
|
|
985
1296
|
|
|
1297
|
+
const forEachDefinition = NODE_DEFINITIONS.find(
|
|
1298
|
+
(definition) => definition.type === 'for_each',
|
|
1299
|
+
)!;
|
|
1300
|
+
|
|
1301
|
+
const forEachNode: NodeTypeSeed = {
|
|
1302
|
+
...templatableNode(forEachDefinition),
|
|
1303
|
+
schemaVersion: 6,
|
|
1304
|
+
uiSchema: { widget: 'for-each-config' },
|
|
1305
|
+
};
|
|
1306
|
+
|
|
986
1307
|
const subWorkflowNode: NodeTypeSeed = {
|
|
987
|
-
...
|
|
988
|
-
schemaVersion:
|
|
1308
|
+
...templatableNode(subWorkflowDefinition),
|
|
1309
|
+
schemaVersion: 5,
|
|
1310
|
+
uiSchema: { widget: 'sub-workflow-config' },
|
|
989
1311
|
};
|
|
990
1312
|
|
|
1313
|
+
const dedicatedEditorNodes: NodeTypeSeed[] = [
|
|
1314
|
+
['event_trigger', 'event-trigger-config'],
|
|
1315
|
+
['db_execute', 'db-execute-config'],
|
|
1316
|
+
['delay', 'delay-config'],
|
|
1317
|
+
['parallel', 'parallel-config'],
|
|
1318
|
+
['if_else', 'if-else-config'],
|
|
1319
|
+
['switch', 'switch-config'],
|
|
1320
|
+
].map(([type, widget]) => ({
|
|
1321
|
+
...templatableNode(
|
|
1322
|
+
NODE_DEFINITIONS.find((definition) => definition.type === type)!,
|
|
1323
|
+
),
|
|
1324
|
+
schemaVersion:
|
|
1325
|
+
type === 'event_trigger'
|
|
1326
|
+
? 4
|
|
1327
|
+
: type === 'db_execute'
|
|
1328
|
+
? 4
|
|
1329
|
+
: type === 'parallel'
|
|
1330
|
+
? 6
|
|
1331
|
+
: ['if_else', 'switch'].includes(type)
|
|
1332
|
+
? 3
|
|
1333
|
+
: 2,
|
|
1334
|
+
uiSchema: {
|
|
1335
|
+
widget,
|
|
1336
|
+
...(type === 'db_execute' && {
|
|
1337
|
+
options: { validationErrors: 'widget' },
|
|
1338
|
+
}),
|
|
1339
|
+
},
|
|
1340
|
+
}));
|
|
1341
|
+
|
|
991
1342
|
export const NODE_TYPES: NodeTypeSeed[] = [
|
|
992
|
-
...
|
|
1343
|
+
...NODE_DEFINITIONS.filter(
|
|
993
1344
|
(definition) =>
|
|
994
1345
|
definition.type !== 'http_request' &&
|
|
995
1346
|
definition.type !== 'code' &&
|
|
1347
|
+
definition.type !== 'for_each' &&
|
|
1348
|
+
!dedicatedEditorNodes.some((node) => node.type === definition.type) &&
|
|
996
1349
|
definition.type !== 'webhook_trigger',
|
|
997
|
-
).map(
|
|
1350
|
+
).map(templatableNode),
|
|
998
1351
|
webhookNode,
|
|
999
1352
|
httpRequestNode,
|
|
1000
1353
|
codeNode,
|
|
1354
|
+
forEachNode,
|
|
1355
|
+
...dedicatedEditorNodes,
|
|
1001
1356
|
humanApprovalNode,
|
|
1002
1357
|
callableTriggerNode,
|
|
1003
|
-
returnResultNode,
|
|
1004
1358
|
externalWaitNode,
|
|
1005
1359
|
subWorkflowNode,
|
|
1006
1360
|
];
|
|
1007
1361
|
|
|
1008
1362
|
export async function seedNodeTypes(prisma: PrismaClient) {
|
|
1009
1363
|
console.log('Seeding workflow node types...');
|
|
1364
|
+
for (const removedType of ['return_result', 'db_query']) {
|
|
1365
|
+
const removedNodeType = await prisma.workflowNodeType.findUnique({
|
|
1366
|
+
where: { type: removedType },
|
|
1367
|
+
select: { id: true },
|
|
1368
|
+
});
|
|
1369
|
+
if (!removedNodeType) continue;
|
|
1370
|
+
await prisma.workflowNodeInstance.deleteMany({
|
|
1371
|
+
where: { nodeTypeId: removedNodeType.id },
|
|
1372
|
+
});
|
|
1373
|
+
await prisma.workflowNodeType.delete({
|
|
1374
|
+
where: { id: removedNodeType.id },
|
|
1375
|
+
});
|
|
1376
|
+
}
|
|
1010
1377
|
for (const nodeType of NODE_TYPES) {
|
|
1011
1378
|
// Json? null requires Prisma.DbNull (SQL NULL) — literal null is rejected at type level.
|
|
1012
1379
|
const outputsValue =
|