diff --git a/src/views/flow/components/NodeTitle.vue b/src/views/flow/components/NodeTitle.vue index 2f0a7f3..78fdde4 100644 --- a/src/views/flow/components/NodeTitle.vue +++ b/src/views/flow/components/NodeTitle.vue @@ -159,7 +159,8 @@ const execute = () => { document.dispatchEvent(new CustomEvent("singleNodeExecution", { bubbles: false, cancelable: false, - detail: { ...props.nodeProperties }, + // 携带节点 ID,供单节点执行弹窗按节点恢复上次选择的机器人。 + detail: { ...props.nodeProperties, nodeId: props.nodeId }, })); }; diff --git a/src/views/flow/components/TestRun.vue b/src/views/flow/components/TestRun.vue index 47daa2c..a2b586d 100644 --- a/src/views/flow/components/TestRun.vue +++ b/src/views/flow/components/TestRun.vue @@ -90,14 +90,42 @@ const props = defineProps({ const ruleFormRef = ref() const rules = ref({}); const tableData = ref([]) +// 按流程缓存整套试运行参数,关闭或执行后再次打开时继续使用。 +const trialRunCache = new Map() const bindingLoading = ref(false) const emptyBindingSummary = (robotId = '') => ({ robotId, matched: 0, missing: 0, untouched: 0 }) const bindingSummary = ref(emptyBindingSummary()) const emits = defineEmits(['close', 'changeState']) +const cloneData = (data) => JSON.parse(JSON.stringify(data || [])) + +// 根据参数层级恢复缓存值,同时兼容流程参数结构发生增删的情况。 +const mergeCachedValues = (source, cached) => { + const cachedByName = new Map((cached || []).map(item => [item.name, item])) + return (source || []).map((item, index) => { + const cachedAtIndex = cached?.[index] + const cachedItem = cachedAtIndex?.name === item.name ? cachedAtIndex : cachedByName.get(item.name) + if (!cachedItem) return item + const merged = { ...item, value: cachedItem.value } + if (Array.isArray(item.children)) { + merged.children = mergeCachedValues(item.children, cachedItem.children) + } + return merged + }) +} + +const cacheKey = () => props.flowId || '__new_flow__' + +// 深拷贝快照,避免后续表单编辑直接修改缓存内容。 +const rememberTrialRunParams = () => { + if (!tableData.value.length) return + trialRunCache.set(cacheKey(), cloneData(tableData.value)) +} + const handleClose = () => { - ruleFormRef.value?.resetFields() + rememberTrialRunParams() + ruleFormRef.value?.clearValidate() emits('close') } @@ -105,14 +133,17 @@ watch(() => props.drawer, (newVal) => { if (newVal) { const data = getStartNodeFormData() - tableData.value = data - bindingSummary.value = emptyBindingSummary() + const cached = trialRunCache.get(cacheKey()) + tableData.value = mergeCachedValues(data, cached) + const robotId = tableData.value.find(item => item.name === 'robotId')?.value || '' + bindingSummary.value = emptyBindingSummary(robotId) loadRobotOptions() } } ) const confirm = () => { + rememberTrialRunParams() lf.fitView() ruleFormRef.value.validate().then(async () => { const formData = formatTableData(tableData.value) diff --git a/src/views/flow/index.vue b/src/views/flow/index.vue index d66ea0c..f620e56 100644 --- a/src/views/flow/index.vue +++ b/src/views/flow/index.vue @@ -245,7 +245,7 @@