优化工作流组件,增强节点数据处理的可选性和安全性,修复潜在的空值引用问题。

This commit is contained in:
2026-05-29 10:19:53 +08:00
parent 032f258912
commit 78d1fd93c8
3 changed files with 92 additions and 81 deletions
@@ -4,16 +4,16 @@
<div v-if="selectedNode">
<el-form label-position="top">
<el-form-item label="节点名称">
<el-input :model-value="selectedNode.data.label" @update:model-value="updateNodeLabel" />
<el-input :model-value="selectedNode.data?.label" @update:model-value="updateNodeLabel" />
</el-form-item>
<el-form-item label="节点类型">
<el-tag>{{ selectedNode.data.nodeCode }}</el-tag>
<el-tag>{{ selectedNode.data?.nodeCode }}</el-tag>
</el-form-item>
<!-- 模型选择 -->
<el-form-item v-if="nodeConfig?.modelConfig && nodeConfig.modelConfig.length > 0" label="选择模型">
<el-button type="primary" @click="emit('openModelSelector')" style="width: 100%">选择模型</el-button>
<div v-if="selectedNode.data.modelConfig?.modelName" class="selected-tag">
<div v-if="selectedNode.data?.modelConfig?.modelName" class="selected-tag">
<el-tag type="success" size="large" closable @close="emit('removeModel')">
{{ selectedNode.data.modelConfig.modelName }}
</el-tag>
@@ -23,7 +23,7 @@
<!-- 技能选择 -->
<el-form-item v-if="nodeConfig?.skillOption" label="选择技能">
<el-button type="primary" @click="emit('openSkillSelector')" style="width: 100%">选择技能</el-button>
<div v-if="selectedNode.data.skillName" class="selected-tag">
<div v-if="selectedNode.data?.skillName" class="selected-tag">
<el-tag type="success" size="large" closable @close="emit('removeSkill')">
{{ selectedNode.data.skillName }}
</el-tag>
@@ -80,7 +80,7 @@
<!-- 上级参数管理 -->
<InputSourceManager
v-if="selectedNode.data.nodeCode !== '__start__'"
v-if="selectedNode.data?.nodeCode !== '__start__'"
:selected-node="selectedNode"
:nodes="allNodes"
:edges="allEdges"
@@ -98,9 +98,9 @@ import type { Node } from '@vue-flow/core';
import InputSourceManager from './InputSourceManager.vue';
interface NodeData {
label: string;
nodeCode: string;
inputSource: Array<{ nodeId: string; field: string[]; quoteOutput?: boolean }> | null;
label?: string;
nodeCode?: string;
inputSource?: Array<{ nodeId: string; field: string[]; quoteOutput?: boolean }> | null;
formConfig?: any[];
modelConfig?: any;
skillName?: string;
@@ -118,15 +118,15 @@ interface NodeConfig {
}
const props = defineProps<{
selectedNode: Node<NodeData> | null;
selectedNode: Node<NodeData, any, string> | null;
availableParams: ParamRef[];
nodeConfig: NodeConfig | null;
allNodes: Node<NodeData>[];
allNodes: Node<NodeData, any, string>[];
allEdges: any[];
}>();
const emit = defineEmits<{
(e: 'update:selectedNode', node: Node<NodeData>): void;
(e: 'update:selectedNode', node: Node<NodeData, any, string>): void;
(e: 'addParam', param: ParamRef): void;
(e: 'openModelSelector'): void;
(e: 'removeModel'): void;
@@ -138,7 +138,7 @@ const emit = defineEmits<{
}>();
const updateNodeLabel = (newLabel: string) => {
if (!props.selectedNode) return;
if (!props.selectedNode?.data) return;
const updatedNode = {
...props.selectedNode,
data: {
@@ -150,13 +150,13 @@ const updateNodeLabel = (newLabel: string) => {
};
const getFieldValue = (fieldName: string) => {
if (!props.selectedNode?.data.formConfig) return '';
if (!props.selectedNode?.data?.formConfig) return '';
const field = props.selectedNode.data.formConfig.find((f: any) => f.field === fieldName);
return field?.value ?? '';
};
const updateFieldValue = (fieldName: string, value: any) => {
if (!props.selectedNode) return;
if (!props.selectedNode?.data) return;
const formConfig = props.selectedNode.data.formConfig || [];
const existingIndex = formConfig.findIndex((f: any) => f.field === fieldName);