bugfix: 切换对话的图片生成
This commit is contained in:
@@ -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
|
||||||
|
if (aiMessage.sessionId === projectStore.state.id) {
|
||||||
projectStore.setProject({ nodeId: versionID })
|
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) {
|
||||||
|
if (aiMessage.sessionId === projectStore.state.id) {
|
||||||
emits('setTitle', jsonData.title)
|
emits('setTitle', jsonData.title)
|
||||||
console.log('发送title', {
|
} else {
|
||||||
title: jsonData.title,
|
newQueue.value.name = jsonData.title
|
||||||
id: params.projectID
|
}
|
||||||
})
|
|
||||||
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
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -128,9 +128,11 @@
|
|||||||
previewType.value = 'url'
|
previewType.value = 'url'
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleOpenSketch = () => {
|
const handleOpenSketch = (id) => {
|
||||||
|
if (id === route.params.id) {
|
||||||
previewType.value = 'sketch'
|
previewType.value = 'sketch'
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => proJectId.value,
|
() => proJectId.value,
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user