From 73b2090bd37eca739055ea60d86df2cab83e88da Mon Sep 17 00:00:00 2001 From: Louis Young <63398145+louisyoungx@users.noreply.github.com> Date: Tue, 10 Jun 2025 15:47:19 +0800 Subject: [PATCH] fix(core): workflow document reload addNode api (#353) --- .../document/src/flow-document.ts | 27 +++---- .../free-layout-core/src/workflow-document.ts | 78 ++++++++++++++++++- 2 files changed, 86 insertions(+), 19 deletions(-) diff --git a/packages/canvas-engine/document/src/flow-document.ts b/packages/canvas-engine/document/src/flow-document.ts index 1076d153..61a53cde 100644 --- a/packages/canvas-engine/document/src/flow-document.ts +++ b/packages/canvas-engine/document/src/flow-document.ts @@ -226,12 +226,7 @@ export class FlowDocument implements Disposable { * @param data * @param addedNodes */ - addNode( - data: AddNodeData, - addedNodes?: FlowNodeEntity[], - ignoreCreateAndUpdateEvent?: boolean, - ignoreBlocks?: boolean - ): FlowNodeEntity { + addNode(data: AddNodeData, addedNodes?: FlowNodeEntity[]): FlowNodeEntity { const { id, type = 'block', originParent, parent, meta, hidden, index } = data; let node = this.getNode(id); let isNew = false; @@ -279,7 +274,7 @@ export class FlowDocument implements Disposable { if (extendNodes && addedNodes) { addedNodes.push(...extendNodes); } - } else if (data.blocks && data.blocks.length > 0 && !ignoreBlocks) { + } else if (data.blocks && data.blocks.length > 0) { // 兼容老的写法 if (!data.blocks[0].type) { this.addInlineBlocks(node, data.blocks, addedNodes); @@ -288,16 +283,14 @@ export class FlowDocument implements Disposable { } } - if (!ignoreCreateAndUpdateEvent) { - if (isNew) { - this.onNodeCreateEmitter.fire({ - node, - data, - json: data, - }); - } else { - this.onNodeUpdateEmitter.fire({ node, data, json: data }); - } + if (isNew) { + this.onNodeCreateEmitter.fire({ + node, + data, + json: data, + }); + } else { + this.onNodeUpdateEmitter.fire({ node, data, json: data }); } return node; diff --git a/packages/canvas-engine/free-layout-core/src/workflow-document.ts b/packages/canvas-engine/free-layout-core/src/workflow-document.ts index e37e7fdc..fb1add8d 100644 --- a/packages/canvas-engine/free-layout-core/src/workflow-document.ts +++ b/packages/canvas-engine/free-layout-core/src/workflow-document.ts @@ -2,7 +2,12 @@ import { customAlphabet } from 'nanoid'; import { inject, injectable, optional, postConstruct } from 'inversify'; import { Emitter, type IPoint } from '@flowgram.ai/utils'; import { NodeEngineContext } from '@flowgram.ai/form-core'; -import { FlowDocument, FlowNodeBaseType, FlowNodeTransformData } from '@flowgram.ai/document'; +import { + AddNodeData, + FlowDocument, + FlowNodeBaseType, + FlowNodeTransformData, +} from '@flowgram.ai/document'; import { injectPlaygroundContext, PlaygroundConfigEntity, @@ -170,7 +175,6 @@ export class WorkflowDocument extends FlowDocument { parent, }, undefined, - true, true ) as WorkflowNodeEntity; @@ -293,6 +297,76 @@ export class WorkflowDocument extends FlowDocument { return node; } + /** + * 添加节点,如果节点已经存在则不会重复创建 + * @param data + * @param addedNodes + */ + addNode( + data: AddNodeData, + addedNodes?: WorkflowNodeEntity[], + ignoreCreateAndUpdateEvent?: boolean + ): WorkflowNodeEntity { + const { id, type = 'block', originParent, parent, meta, hidden, index } = data; + let node = this.getNode(id); + let isNew = false; + const register = this.getNodeRegistry(type, data.originParent); + // node 类型变化则全部删除重新来 + if (node && node.flowNodeType !== data.type) { + node.dispose(); + node = undefined; + } + if (!node) { + const { dataRegistries } = register; + node = this.entityManager.createEntity(WorkflowNodeEntity, { + id, + document: this, + flowNodeType: type, + originParent, + meta, + }); + const datas = dataRegistries + ? this.nodeDataRegistries.concat(...dataRegistries) + : this.nodeDataRegistries; + node.addInitializeData(datas); + node.onDispose(() => this.onNodeDisposeEmitter.fire({ node: node! })); + this.options.fromNodeJSON?.(node, data, true); + isNew = true; + } else { + this.options.fromNodeJSON?.(node, data, false); + } + // 初始化数据重制 + node.initData({ + originParent, + parent, + meta, + hidden, + index, + }); + addedNodes?.push(node); + // 自定义创建逻辑 + if (register.onCreate) { + const extendNodes = register.onCreate(node, data); + if (extendNodes && addedNodes) { + addedNodes.push(...extendNodes); + } + } + + if (!ignoreCreateAndUpdateEvent) { + if (isNew) { + this.onNodeCreateEmitter.fire({ + node, + data, + json: data, + }); + } else { + this.onNodeUpdateEmitter.fire({ node, data, json: data }); + } + } + + return node; + } + get layout(): FreeLayout { const layout = this.layouts.find((layout) => layout.name == this.currentLayoutKey); if (!layout) {