From 8d44d5b351fb1318e9fa77cf62d90abfff978a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=B3?= Date: Thu, 16 Jul 2026 17:28:29 +0800 Subject: [PATCH] =?UTF-8?q?vear:=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B6=88=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packageA/pages/chat/components/ai-paging.vue | 49 ++++++++++++-------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/packageA/pages/chat/components/ai-paging.vue b/packageA/pages/chat/components/ai-paging.vue index cbe536e..9b37097 100644 --- a/packageA/pages/chat/components/ai-paging.vue +++ b/packageA/pages/chat/components/ai-paging.vue @@ -425,6 +425,7 @@ const { speak, pause, resume, isSpeaking, isPaused, cancelAudio } = useTTSPlayer const instance = getCurrentInstance(); // state +const ACTIVE_TAB_KEY = 'chat_active_tab'; const activeTab = ref('policy'); // 'policy' or 'job' const queries = ref([]); const guessList = ref([]); @@ -471,7 +472,16 @@ const audiowaveStyle = computed(() => { : '#f1f1f1'; }); +function setActiveTab(tab) { + activeTab.value = tab; + uni.setStorageSync(ACTIVE_TAB_KEY, tab); +} + onMounted(async () => { + const cachedActiveTab = uni.getStorageSync(ACTIVE_TAB_KEY); + if (cachedActiveTab === 'policy' || cachedActiveTab === 'job') { + activeTab.value = cachedActiveTab; + } changeQueries(); scrollToBottom(); isAudioPermission.value = await requestMicPermission(); @@ -546,10 +556,13 @@ const sendMessage = (text) => { if (speechIndex.value !== index) { // 延迟TTS,等待内容更完整 // 只有在内容长度超过50个字符或者包含岗位信息时才开始朗读 - const hasJobInfo = message.displayText.includes('```job-json') || + const hasJobInfo = isJobCardMessage(message) || message.displayText.includes('岗位') || message.displayText.includes('公司') || message.displayText.includes('薪资'); + if (hasJobInfo) { + setActiveTab('job'); + } if (message.displayText.length > 50 || hasJobInfo) { console.log('🎵 Starting streaming TTS for message index:', index); @@ -578,6 +591,9 @@ const sendMessage = (text) => { const lastMessageIndex = messages.value.length - 1; if (lastMessageIndex >= 0) { const lastMessage = messages.value[lastMessageIndex]; + if (isJobCardMessage(lastMessage)) { + setActiveTab('job'); + } if (!lastMessage.self && lastMessage.displayText && lastMessage.displayText.trim()) { console.log('🎵 Final TTS for complete message'); console.log('📝 Final text length:', lastMessage.displayText.length); @@ -1502,7 +1518,18 @@ function getRandomJobQueries(queries, count = 2) { // 切换tab function switchTab(tab) { - activeTab.value = tab; + setActiveTab(tab); +} + +function isJobCardMessage(msg) { + const content = msg?.displayText || ''; + return ( + /```\s*job-json/.test(content) || + content.includes('岗位推荐') || + content.includes('推荐岗位') || + content.includes('岗位信息') || + (content.includes('```') && content.includes('公司') && content.includes('薪资')) + ); } // 检查消息是否应该显示在当前tab @@ -1511,26 +1538,10 @@ function shouldShowMessage(msg) { return true; // 用户自己的消息总是显示 } + const isJobCard = isJobCardMessage(msg); if (activeTab.value === 'policy') { - // 政策查询tab:显示除了岗位卡片以外的所有内容 - // 岗位卡片通常包含特定的标记,如```job-json或岗位推荐等关键词 - const isJobCard = msg.displayText && ( - msg.displayText.includes('```job-json') || - msg.displayText.includes('岗位推荐') || - msg.displayText.includes('推荐岗位') || - msg.displayText.includes('岗位信息') || - (msg.displayText.includes('```') && msg.displayText.includes('公司') && msg.displayText.includes('薪资')) - ); return !isJobCard; } else { - // 岗位推荐tab:只显示岗位卡片内容 - const isJobCard = msg.displayText && ( - msg.displayText.includes('```job-json') || - msg.displayText.includes('岗位推荐') || - msg.displayText.includes('推荐岗位') || - msg.displayText.includes('岗位信息') || - (msg.displayText.includes('```') && msg.displayText.includes('公司') && msg.displayText.includes('薪资')) - ); return isJobCard; } }