feat: 前端 store 增加 sessionMeta 状态 + ScriptView 增强 originalQuery 兜底和可靠刷新
This commit is contained in:
@@ -1649,6 +1649,19 @@ const runGeneration = async ({ prompt, displayText, source = 'text', saveTheme }
|
|||||||
novelSessionId.value = ''
|
novelSessionId.value = ''
|
||||||
firstQuery.value = text // 记住首次心愿,用于后续 followup 保存剧本
|
firstQuery.value = text // 记住首次心愿,用于后续 followup 保存剧本
|
||||||
console.log('[ScriptView] 设置 firstQuery:', { length: text.length })
|
console.log('[ScriptView] 设置 firstQuery:', { length: text.length })
|
||||||
|
|
||||||
|
// 把原始心愿保存到 store,供 followup 时透传给后端(避免 originalQuery 丢失导致不保存)
|
||||||
|
if (store.setSessionMeta) {
|
||||||
|
store.setSessionMeta({
|
||||||
|
sessionId: '', // 后续在 status 事件中更新
|
||||||
|
scriptId: '',
|
||||||
|
conversationId: '',
|
||||||
|
originalQuery: text,
|
||||||
|
style: 'career',
|
||||||
|
length: 'short'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pendingNextResponse.value = true // 标记等待下一个 assistant 响应
|
pendingNextResponse.value = true // 标记等待下一个 assistant 响应
|
||||||
resumeableSessionId.value = ''
|
resumeableSessionId.value = ''
|
||||||
outlineFeedback.value = ''
|
outlineFeedback.value = ''
|
||||||
@@ -1689,13 +1702,23 @@ const runGeneration = async ({ prompt, displayText, source = 'text', saveTheme }
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleShortNovelEvent = (event) => {
|
const handleShortNovelEvent = async (event) => {
|
||||||
const { type, session_id, payload = {} } = event
|
const { type, session_id, payload = {} } = event
|
||||||
const timestamp = Date.now()
|
const timestamp = Date.now()
|
||||||
|
|
||||||
console.log('[ScriptView] 收到事件:', { type, session_id, timestamp })
|
console.log('[ScriptView] 收到事件:', { type, session_id, timestamp })
|
||||||
|
|
||||||
if (session_id) novelSessionId.value = session_id
|
if (session_id) {
|
||||||
|
novelSessionId.value = session_id
|
||||||
|
// 把外部 short-novel-service 返回的 session_id 同步到 store,供 followup 透传
|
||||||
|
if (store.setSessionMeta && store.getSessionMeta) {
|
||||||
|
const meta = store.getSessionMeta()
|
||||||
|
if (meta) {
|
||||||
|
meta.sessionId = session_id
|
||||||
|
store.setSessionMeta(meta)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'status':
|
case 'status':
|
||||||
@@ -1751,8 +1774,25 @@ const handleShortNovelEvent = (event) => {
|
|||||||
generationStatus.value = 'idle'
|
generationStatus.value = 'idle'
|
||||||
pendingNextResponse.value = false
|
pendingNextResponse.value = false
|
||||||
persistResultMessages()
|
persistResultMessages()
|
||||||
// 从后端刷新剧本列表,确保新生成的短篇出现在历史中(非阻塞)
|
|
||||||
store.fetchScripts()
|
// 把 scriptId/conversationId 同步到 store,便于详情页/历史页查最新剧本
|
||||||
|
if (store.setSessionMeta && store.getSessionMeta) {
|
||||||
|
const meta = store.getSessionMeta()
|
||||||
|
if (meta) {
|
||||||
|
meta.scriptId = scriptId.value
|
||||||
|
meta.conversationId = conversationId.value
|
||||||
|
store.setSessionMeta(meta)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 可靠刷新剧本列表:使用 await 确保后端返回后再继续,避免列表中看不到最新剧本
|
||||||
|
try {
|
||||||
|
await store.fetchScripts()
|
||||||
|
console.log('[ScriptView] novel_done 后剧本列表刷新成功')
|
||||||
|
} catch (e) {
|
||||||
|
console.error('[ScriptView] novel_done 后剧本列表刷新失败:', e)
|
||||||
|
uni.showToast({ title: '列表刷新失败,请手动刷新', icon: 'none' })
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case 'error':
|
case 'error':
|
||||||
@@ -1781,15 +1821,24 @@ const submitClarification = (answer) => {
|
|||||||
}
|
}
|
||||||
pendingNextResponse.value = true // 标记等待下一个 assistant 响应
|
pendingNextResponse.value = true // 标记等待下一个 assistant 响应
|
||||||
answeringClarification.value = true
|
answeringClarification.value = true
|
||||||
|
|
||||||
|
// originalQuery 兜底:优先 firstQuery,缺失时从 store 获取,避免 followup 时 originalQuery 为空导致不保存
|
||||||
|
const effectiveOriginalQuery = firstQuery.value || (store.getSessionMeta && store.getSessionMeta()?.originalQuery) || ''
|
||||||
|
if (!effectiveOriginalQuery) {
|
||||||
|
uni.showToast({ title: '原始心愿已丢失,请重新开始', icon: 'none' })
|
||||||
|
answeringClarification.value = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
console.log('[ScriptView] submitClarification:', {
|
console.log('[ScriptView] submitClarification:', {
|
||||||
sessionId: novelSessionId.value,
|
sessionId: novelSessionId.value,
|
||||||
originalQueryLength: firstQuery.value?.length
|
originalQueryLength: effectiveOriginalQuery.length
|
||||||
})
|
})
|
||||||
currentStreamTask.value = followupStream({
|
currentStreamTask.value = followupStream({
|
||||||
sessionId: novelSessionId.value,
|
sessionId: novelSessionId.value,
|
||||||
action: 'answer_clarification',
|
action: 'answer_clarification',
|
||||||
payload: { answer }, // 后端仍收 value
|
payload: { answer }, // 后端仍收 value
|
||||||
originalQuery: firstQuery.value, // 首次心愿文本,用于后续 novel_done 保存
|
originalQuery: effectiveOriginalQuery, // 首次心愿文本,用于后续 novel_done 保存
|
||||||
onEvent: handleShortNovelEvent,
|
onEvent: handleShortNovelEvent,
|
||||||
onError: (errMsg) => markGenerationFailed(errMsg)
|
onError: (errMsg) => markGenerationFailed(errMsg)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ const state = reactive({
|
|||||||
inspirationRecommendations: [],
|
inspirationRecommendations: [],
|
||||||
paths: [],
|
paths: [],
|
||||||
currentPath: null,
|
currentPath: null,
|
||||||
|
// 当前心愿实现的 session 元数据(用于 followup 时传递 originalQuery 兜底)
|
||||||
|
currentSessionMeta: null,
|
||||||
registrationData: {
|
registrationData: {
|
||||||
nickname: '',
|
nickname: '',
|
||||||
gender: '',
|
gender: '',
|
||||||
@@ -264,6 +266,34 @@ const fetchScripts = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前心愿实现的 session 元数据
|
||||||
|
* 用于在后续 followup 调用中透传 originalQuery/style/length
|
||||||
|
*
|
||||||
|
* @param {{ sessionId?: string, scriptId?: string, conversationId?: string, originalQuery: string, style?: string, length?: string }} meta
|
||||||
|
*/
|
||||||
|
const setSessionMeta = (meta) => {
|
||||||
|
if (!meta || !meta.originalQuery) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
state.currentSessionMeta = { ...meta, updatedAt: Date.now() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前心愿实现的 session 元数据
|
||||||
|
* @returns {object|null}
|
||||||
|
*/
|
||||||
|
const getSessionMeta = () => {
|
||||||
|
return state.currentSessionMeta
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除当前 session 元数据
|
||||||
|
*/
|
||||||
|
const clearSessionMeta = () => {
|
||||||
|
state.currentSessionMeta = null
|
||||||
|
}
|
||||||
|
|
||||||
const createScript = async (scriptData) => {
|
const createScript = async (scriptData) => {
|
||||||
try {
|
try {
|
||||||
const res = await epicScriptService.createScript(scriptData)
|
const res = await epicScriptService.createScript(scriptData)
|
||||||
@@ -495,6 +525,9 @@ export const useAppStore = () => {
|
|||||||
createScript,
|
createScript,
|
||||||
updateScript,
|
updateScript,
|
||||||
deleteScript,
|
deleteScript,
|
||||||
|
setSessionMeta,
|
||||||
|
getSessionMeta,
|
||||||
|
clearSessionMeta,
|
||||||
fetchInspirationRecommendations,
|
fetchInspirationRecommendations,
|
||||||
fetchRandomInspirations,
|
fetchRandomInspirations,
|
||||||
generateScriptFromInspiration,
|
generateScriptFromInspiration,
|
||||||
|
|||||||
Reference in New Issue
Block a user