From 981f9ed4bf307c21ca1de6dff601d67add0adbd3 Mon Sep 17 00:00:00 2001 From: kicer Date: Wed, 22 Jul 2026 17:17:00 +0800 Subject: [PATCH] fix issues --- server/ai/prompt.js | 2 +- server/handlers.js | 8 ++++++++ server/public/js/chat.js | 2 ++ server/routes/messages.js | 16 +++++++++++----- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/server/ai/prompt.js b/server/ai/prompt.js index c7f308b..f6ce4f7 100644 --- a/server/ai/prompt.js +++ b/server/ai/prompt.js @@ -42,7 +42,7 @@ function buildSystemPrompt(username, isAdmin) { - 信息不完整 → action="ask" 追问 - 新建 vs 更新: * "昨天/今天/又/再/新/另一批"等重复购买 → is_new: true(强制新建) - * "改一下/更新/修改/调整"等 → 不提供 is_new(匹配已有更新) + * "改一下/更新/修改/调整/更正/搞错了/不对/错了/不是XX是YY"等纠正意图 → 不提供 is_new(匹配已有更新) * "纯图片+物品名"不是新建,不要返回 is_new * 无法确定 → 默认 is_new: true - amount 由系统自动计算(quantity × unit_price + freight),AI 无需提供 diff --git a/server/handlers.js b/server/handlers.js index f9219e6..5f7555d 100644 --- a/server/handlers.js +++ b/server/handlers.js @@ -127,6 +127,14 @@ function handleAIResult(aiResult, roomId, username, originalText, attachments) { } if (!isNew && !purchase) { purchase = db.prepare('SELECT * FROM purchases WHERE room_id = ? AND item LIKE ? AND status != ?').get(roomId, `%${aiResult.purchase_item}%`, '已完成'); + // 全名匹配失败 → 用物品名核心关键词(去括号内容)再次尝试 + if (!purchase) { + const keyword = aiResult.purchase_item.replace(/[((].*[))]/g, '').trim(); + if (keyword.length >= 2 && keyword !== aiResult.purchase_item) { + console.log('🔍 全名不匹配,尝试关键词:', keyword); + purchase = db.prepare('SELECT * FROM purchases WHERE room_id = ? AND item LIKE ? AND status != ?').get(roomId, `%${keyword}%`, '已完成'); + } + } } console.log('📦 purchase_item:', aiResult.purchase_item, isNew ? '(强制新建)' : purchase ? '(匹配已有)' : '(未匹配-新建)'); diff --git a/server/public/js/chat.js b/server/public/js/chat.js index 34f1f98..4f9d5f4 100644 --- a/server/public/js/chat.js +++ b/server/public/js/chat.js @@ -65,6 +65,8 @@ function renderAllMessages(msgs) { } function appendMessage(msg) { + // 去重:轮询和 WebSocket 可能投递同一条消息 + if (Store.messageCache.some(m => m.id === msg.id)) return; Store.messageCache.push(msg); messagesContainer.insertAdjacentHTML('beforeend', renderMessageHTML(msg)); scrollToBottom(); diff --git a/server/routes/messages.js b/server/routes/messages.js index 9691eb5..94f972a 100644 --- a/server/routes/messages.js +++ b/server/routes/messages.js @@ -60,11 +60,17 @@ async function analyzeWithDeepSeek(text, historyMessages, username, isAdmin) { ]; const content = await callDeepSeek(messages, 0.1); console.log('🤖 AI 返回:', content); - const parsed = JSON.parse(content.replace(/```json|```/g, '').trim()); - normalize(parsed); - const v = validate(parsed); - if (!v.valid) console.warn('⚠️ AI 返回校验失败:', v.error); - return parsed; + try { + const parsed = JSON.parse(content.replace(/```json|```/g, '').trim()); + normalize(parsed); + const v = validate(parsed); + if (!v.valid) console.warn('⚠️ AI 返回校验失败:', v.error); + return parsed; + } catch (e) { + // AI 返回非 JSON(如纯文本回复图片消息)→ 降级为 chat + console.warn('⚠️ AI 返回非 JSON,降级为 chat:', content.substring(0, 50)); + return { action: 'chat', reply: content }; + } } module.exports = router;