): void;
(e: 'openModelSelector'): void;
@@ -183,6 +194,18 @@ const updateNodeLabel = (newLabel: string) => {
emit('update:selectedNode', updatedNode);
};
+const updateNodeDesc = (newDesc: string) => {
+ if (!props.selectedNode?.data) return;
+ const updatedNode = {
+ ...props.selectedNode,
+ data: {
+ ...props.selectedNode.data,
+ desc: newDesc,
+ },
+ };
+ emit('update:selectedNode', updatedNode);
+};
+
const getFieldValue = (fieldName: string) => {
if (!props.selectedNode?.data?.formConfig) return '';
const field = props.selectedNode.data.formConfig.find((f: any) => f.field === fieldName);
diff --git a/src/views/settings/workflow/component/SkillSelector.vue b/src/views/settings/workflow/component/SkillSelector.vue
index b5e855f..18a1d23 100644
--- a/src/views/settings/workflow/component/SkillSelector.vue
+++ b/src/views/settings/workflow/component/SkillSelector.vue
@@ -34,7 +34,6 @@
v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize"
:total="pagination.total"
- :page-sizes="[10, 20, 50]"
layout="total, prev, pager, next"
small
@current-change="handlePageChange"
@@ -82,6 +81,7 @@ watch(
visible.value = val;
if (val) {
selectedSkill.value = props.defaultSkill || null;
+ pagination.pageNum = 1;
fetchSkillList();
}
}
@@ -100,6 +100,11 @@ const fetchSkillList = async () => {
const res = await getWorkflowSkillList(params);
skillList.value = res.data?.list || [];
pagination.total = res.data?.total || 0;
+ // 预选项仅为部分信息(切换节点后无 id)时,按名称匹配当前页以高亮
+ if (selectedSkill.value && !selectedSkill.value.id && selectedSkill.value.name) {
+ const matched = skillList.value.find((s) => s.name === selectedSkill.value!.name);
+ if (matched) selectedSkill.value = matched;
+ }
} catch {
skillList.value = [];
pagination.total = 0;
diff --git a/src/views/settings/workflow/index.vue b/src/views/settings/workflow/index.vue
index 503e430..df2e783 100644
--- a/src/views/settings/workflow/index.vue
+++ b/src/views/settings/workflow/index.vue
@@ -30,7 +30,7 @@
([]);
const nodeLibraryCollapsed = ref(false);
-const filteredNodeLibraryGroups = computed(() => {
- return nodeLibraryGroups.value;
-});
-
// 节点配置映射:nodeCode -> 节点配置
const nodeConfigMap = computed(() => {
const map = new Map<
@@ -243,6 +240,11 @@ const onConnect = (connection: Connection) => {
const onNodeClick = (event: { node: Node }) => {
selectedNode.value = event.node;
+ // 同步选择器预选项,避免展示上一个节点的模型/技能
+ const mc = event.node.data?.modelConfig;
+ selectedModelData.value = mc?.modelName ? { modelName: mc.modelName, modelType: mc.modelType } : null;
+ const sk = event.node.data?.skillName;
+ selectedSkillData.value = sk ? { name: sk } : null;
};
const updateSelectedNode = (updatedNode: Node) => {
@@ -444,6 +446,7 @@ const getNodeLibrary = async () => {
nodeLibraryGroups.value = res.data?.groups || [];
} catch {
nodeLibraryGroups.value = [];
+ ElMessage.error('节点库加载失败');
}
};
@@ -469,7 +472,7 @@ const addNodeFromLibrary = (nodeCode: string, nodeName: string) => {
id: `node-${++nodeId}`,
type: 'default',
position: { x: spawnX, y: spawnY },
- data: { label: nodeName, nodeCode, patchLayout: false },
+ data: { label: nodeName, nodeCode, desc: '', patchLayout: false },
style: { background: '#fff', border: '2px solid #3b82f6', borderRadius: '8px', padding: '10px 20px' },
},
]);
@@ -547,6 +550,7 @@ const loadWorkflowFromDsl = (dsl: any) => {
data: {
label: n.name || '',
nodeCode: n.nodeCode,
+ desc: n.desc || '',
formConfig: n.formConfig || null,
modelConfig: n.modelConfig || null,
skillName: n.skillName || null,
@@ -605,14 +609,16 @@ const confirmSaveWorkflow = async () => {
return;
}
+ const startNode = nodes.value.find((n) => isStartNode(n));
const workflowDsl = {
version: '1.0.0',
- startNodeId: nodes.value[0]?.id || '',
+ startNodeId: startNode?.id || '',
nodes: nodes.value.map((n) => ({
id: n.id,
nodeCode: n.data?.nodeCode || 'unknown',
name: n.data?.label || '',
type: n.type || 'default',
+ desc: n.data?.desc || null,
skillName: n.data?.skillName || null,
patchLayout: n.data?.patchLayout || false,
config: {