bugfix: 切换对话的图片生成

This commit is contained in:
2026-04-02 17:04:35 +08:00
parent 3d642eb33f
commit 7e41da5ec8
2 changed files with 73 additions and 25 deletions

View File

@@ -21,7 +21,16 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, computed, onUnmounted, onMounted, nextTick, watch } from 'vue' import {
ref,
reactive,
computed,
onUnmounted,
onMounted,
nextTick,
watch,
onActivated
} from 'vue'
import List from './List.vue' import List from './List.vue'
import Input from '../../components/Input.vue' import Input from '../../components/Input.vue'
import { chatUrl } from '@/api/agent' import { chatUrl } from '@/api/agent'
@@ -29,8 +38,10 @@
import { useUserInfoStore, useProjectStore, useAgentStore } from '@/stores' import { useUserInfoStore, useProjectStore, useAgentStore } from '@/stores'
import MyEvent from '@/utils/myEvent' import MyEvent from '@/utils/myEvent'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { useRoute } from 'vue-router'
const { t } = useI18n() const { t } = useI18n()
const route = useRoute()
const userStore = useUserInfoStore() const userStore = useUserInfoStore()
const agentStore = useAgentStore() const agentStore = useAgentStore()
@@ -56,7 +67,7 @@
const isGenerating = ref(false) const isGenerating = ref(false)
const isPaused = ref(false) // 标记是否为主动暂停 const isPaused = ref(false) // 标记是否为主动暂停
const params = reactive<AgentParamsType>({ const params = reactive<AgentParamsType>({
projectID: null, projectID: route.params.id as string,
message: '', message: '',
token: userStore.state.token, token: userStore.state.token,
versionID: '', versionID: '',
@@ -116,7 +127,6 @@
onMounted(() => { onMounted(() => {
MyEvent.add('resetAgent', handleReset) MyEvent.add('resetAgent', handleReset)
// 检查 store 中是否有初始项目数据 // 检查 store 中是否有初始项目数据
// projectStore.setId('1') // 临时设置项目ID为1实际应用中应根据上下文动态设置
const initialData = agentStore.getInitialProjectData const initialData = agentStore.getInitialProjectData
if (initialData) { if (initialData) {
// 等待页面渲染完成后自动发送初始消息 // 等待页面渲染完成后自动发送初始消息
@@ -142,6 +152,27 @@
} }
}) })
// 用于存储不在页面显示但是仍进行中的对话信息
const newQueue = ref<{
nodeId?: string
name?: string
}>({})
onActivated(() => {
if (newQueue.value.nodeId) {
projectStore.setProject({ nodeId: newQueue.value.nodeId })
}
if (newQueue.value.name) {
MyEvent.emit('newTitle', {
title: newQueue.value.name,
id: params.projectID
})
}
if (newQueue.value.newSketch) {
mergeUniqueKeys(sketchList.value, newQueue.value.newSketch)
}
newQueue.value = {}
})
const handleSendMessage = async ( const handleSendMessage = async (
message: { message: {
text: string text: string
@@ -176,7 +207,7 @@
id: messageList.value.length + 1, id: messageList.value.length + 1,
text: '', text: '',
isUser: false, isUser: false,
sessionId: projectStore.state.id, sessionId: route.params.id as string,
loading: true, loading: true,
thinking: false, thinking: false,
thinkingText: '', thinkingText: '',
@@ -188,7 +219,7 @@
const abortController = createAbortController() const abortController = createAbortController()
// console.log('token---', params.token, '参数---', params) // console.log('token---', params.token, '参数---', params)
params.projectID = projectStore.state.id params.projectID = route.params.id as string
try { try {
const urlParams = new URLSearchParams<AgentParamsType>({ const urlParams = new URLSearchParams<AgentParamsType>({
...params, ...params,
@@ -301,7 +332,7 @@
) { ) {
isGeneratingReport.value = false isGeneratingReport.value = false
sessionStorage.setItem( sessionStorage.setItem(
'reportsContent_' + projectStore.state.id, 'reportsContent_' + params.projectID,
reportsContent.value reportsContent.value
) )
} }
@@ -339,7 +370,11 @@
.filter((line) => line.startsWith('data:')) .filter((line) => line.startsWith('data:'))
.map((line) => line.replace(/^data:\s*/, ''))[0] .map((line) => line.replace(/^data:\s*/, ''))[0]
params.versionID = versionID params.versionID = versionID
projectStore.setProject({ nodeId: versionID }) if (aiMessage.sessionId === projectStore.state.id) {
projectStore.setProject({ nodeId: versionID })
} else {
newQueue.value.nodeId = versionID
}
} }
if (eventName === 'tool') { if (eventName === 'tool') {
@@ -357,11 +392,12 @@
contentBody += `<slot slot-name="url"></slot>` contentBody += `<slot slot-name="url"></slot>`
} }
if (jsonData.title) { if (jsonData.title) {
emits('setTitle', jsonData.title) if (aiMessage.sessionId === projectStore.state.id) {
console.log('发送title', { emits('setTitle', jsonData.title)
title: jsonData.title, } else {
id: params.projectID newQueue.value.name = jsonData.title
}) }
MyEvent.emit('newTitle', { MyEvent.emit('newTitle', {
title: jsonData.title, title: jsonData.title,
id: params.projectID id: params.projectID
@@ -370,15 +406,14 @@
if (hasSketch) { if (hasSketch) {
hasSketchEvent = true hasSketchEvent = true
let tempArr = []
Object.keys(jsonData).forEach((key) => { if (params.projectID === projectStore.state.id) {
if (!sketchList.value.some((item) => item[key])) { mergeUniqueKeys(sketchList.value, jsonData)
sketchList.value.push({ MyEvent.emit('OpenSketch', params.projectID)
[key]: jsonData[key] } else {
}) mergeUniqueKeys(tempArr, jsonData)
} newQueue.value.newSketch = tempArr
}) }
MyEvent.emit('OpenSketch')
} }
if (eventName === 'reportName' || eventName === 'reportTitle') { if (eventName === 'reportName' || eventName === 'reportTitle') {
aiMessage.reportName = jsonData.reportName || jsonData.reportTitle aiMessage.reportName = jsonData.reportName || jsonData.reportTitle
@@ -633,6 +668,18 @@
}) })
} }
const mergeUniqueKeys = (targetArr, newData) => {
// 提取现有数组中所有的 key存入 Set 以实现 O(1) 查询
const existingKeys = new Set(targetArr.flatMap((item) => Object.keys(item)))
Object.entries(newData).forEach(([key, value]) => {
if (!existingKeys.has(key)) {
targetArr.push({ [key]: value })
existingKeys.add(key) // 防止 newData 内部有重复 key 时重复插入
}
})
}
defineExpose({ defineExpose({
setChatInfo setChatInfo
}) })

View File

@@ -128,8 +128,10 @@
previewType.value = 'url' previewType.value = 'url'
} }
const handleOpenSketch = () => { const handleOpenSketch = (id) => {
previewType.value = 'sketch' if (id === route.params.id) {
previewType.value = 'sketch'
}
} }
watch( watch(
@@ -145,7 +147,6 @@
) )
onMounted(() => { onMounted(() => {
console.log('11111agentindex')
MyEvent.add('openReport', handleOpenReport) MyEvent.add('openReport', handleOpenReport)
MyEvent.add('openUrls', handleOpenUrls) MyEvent.add('openUrls', handleOpenUrls)
MyEvent.add('openSketch', handleOpenSketch) MyEvent.add('openSketch', handleOpenSketch)
@@ -157,7 +158,7 @@
onUnmounted(() => { onUnmounted(() => {
MyEvent.remove('openReport', handleOpenReport) MyEvent.remove('openReport', handleOpenReport)
MyEvent.remove('openUrls', handleOpenUrls) MyEvent.remove('openUrls', handleOpenUrls)
MyEvent.remove('OpenSketch') MyEvent.remove('OpenSketch', handleOpenSketch)
}) })
</script> </script>