ソースを参照

fix: 调整运行弹窗

jiaxing.liao 1 ヶ月 前
コミット
e917006c18

+ 33 - 33
apps/web/src/features/RunWorkflow/components/ResultTab.vue

@@ -3,6 +3,7 @@ import { computed } from 'vue'
 import CodeEditor from '@/nodes/_base/CodeEditor.vue'
 
 const props = defineProps<{
+	hasOutputNode: boolean
 	hasExecutionData: boolean
 	isRunning: boolean
 	finalResultText: string
@@ -14,44 +15,42 @@ const editorValue = computed(() => props.finalResultText || '-')
 
 <template>
 	<div class="tab-pane tab-pane--scroll">
-		<div v-if="!hasExecutionData" class="empty-state">无结果</div>
-		<div v-else-if="isRunning && !finalResultText" class="running-state">
-			<div class="running-state__header">
-				<div class="running-state__signal">
-					<span></span>
-					<span></span>
-					<span></span>
+		<template v-if="props.hasOutputNode">
+			<div v-if="!hasExecutionData" class="empty-state">无结果</div>
+			<div v-else-if="isRunning && !finalResultText" class="running-state">
+				<div class="running-state__header">
+					<div class="running-state__signal">
+						<span></span>
+						<span></span>
+						<span></span>
+					</div>
+					<div>
+						<div class="running-state__title">Workflow Running</div>
+						<div class="running-state__desc">正在执行,请等待...</div>
+					</div>
 				</div>
-				<div>
-					<div class="running-state__title">Workflow Running</div>
-					<div class="running-state__desc">正则执行,请等待...</div>
+				<div class="running-state__skeleton">
+					<div class="skeleton-line skeleton-line--lg"></div>
+					<div class="skeleton-line"></div>
+					<div class="skeleton-line"></div>
+					<div class="skeleton-line skeleton-line--sm"></div>
 				</div>
 			</div>
-			<div class="running-state__skeleton">
-				<div class="skeleton-line skeleton-line--lg"></div>
-				<div class="skeleton-line"></div>
-				<div class="skeleton-line"></div>
-				<div class="skeleton-line skeleton-line--sm"></div>
-			</div>
-		</div>
-		<div v-else class="panel" :class="{ 'panel--running': isRunning }">
-			<div class="panel-header">
+			<div v-else class="panel" :class="{ 'panel--running': isRunning }">
 				<div class="section-title">输出</div>
-				<div v-if="isRunning" class="running-badge">运行中...</div>
-				<el-button text @click="$emit('copy', finalResultValue)">复制</el-button>
-			</div>
-			<div class="editor-shell">
-				<div v-if="isRunning" class="editor-shell__scanner"></div>
-				<CodeEditor
-					:model-value="editorValue"
-					language="json"
-					:tools="true"
-					:read-only="true"
-					:allow-change-language="false"
-					:height="300"
-				/>
+				<div class="editor-shell">
+					<div v-if="isRunning" class="editor-shell__scanner"></div>
+					<CodeEditor
+						:model-value="editorValue"
+						language="json"
+						:tools="true"
+						:read-only="true"
+						:allow-change-language="false"
+						:height="300"
+					/>
+				</div>
 			</div>
-		</div>
+		</template>
 	</div>
 </template>
 
@@ -216,6 +215,7 @@ const editorValue = computed(() => props.finalResultText || '-')
 	font-size: 15px;
 	font-weight: 600;
 	color: #344054;
+	margin-bottom: 12px;
 }
 
 .running-badge {

+ 0 - 0
apps/web/src/features/RunWorkflow/components/TriggerTab.vue


+ 24 - 2
apps/web/src/features/RunWorkflow/index.vue

@@ -72,6 +72,27 @@ const currentExecution = computed<RunnerExecution | null>(() => {
 })
 
 const traceNodes = computed(() => currentExecution.value?.nodes || runnerStore.nodes || [])
+const outputNodeIds = computed(() => {
+	return new Set(
+		(props.workflow?.nodes || [])
+			.filter((node) => {
+				const nodeType = (node as any)?.nodeType || (node as any)?.data?.nodeType
+				return nodeType === 'end'
+			})
+			.map((node) => node.id)
+	)
+})
+const hasOutputNode = computed(() => outputNodeIds.value.size > 0)
+const outputNodeState = computed(() => {
+	const nodes = [...traceNodes.value]
+	return (
+		nodes.reverse().find((node) => {
+			return outputNodeIds.value.has(node.nodeId) || node.nodeType === 'end'
+		}) || null
+	)
+})
+const outputNodeResultValue = computed(() => outputNodeState.value?.track?.output_variable ?? null)
+const outputNodeResultText = computed(() => formatDisplayValue(outputNodeResultValue.value))
 
 const hasExecutionData = computed(
 	() => !!currentExecution.value || !!submittedParams.value || !!runnerStore.agentResult
@@ -420,10 +441,11 @@ function statusClass(status?: NodeStatus | RunnerStatus | null) {
 					</el-tab-pane>
 					<el-tab-pane v-if="!props.inputOnly" label="结果" name="result">
 						<ResultTab
+							:has-output-node="hasOutputNode"
 							:has-execution-data="hasExecutionData"
 							:is-running="isRunning"
-							:final-result-text="finalResultText"
-							:final-result-value="finalResultValue"
+							:final-result-text="outputNodeResultText"
+							:final-result-value="outputNodeResultValue"
 						/>
 					</el-tab-pane>
 					<el-tab-pane v-if="!props.inputOnly" label="详情" name="detail">