From 44a8fbe0c92a2d01f21537e8c0ac279a9c21b38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E8=80=81=E7=99=BD=E5=85=94?= Date: Wed, 29 Oct 2025 15:21:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=93=8D=E4=BD=9C=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E4=BC=98=E5=85=88=20-=20=E4=BB=BB=E4=BD=95=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A1=8C=E4=B8=BA=E7=AB=8B=E5=8D=B3=E6=89=93=E6=96=AD?= =?UTF-8?q?AI=20=E5=94=AF=E4=B8=80ID=E9=AA=8C=E8=AF=81=20-=20=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E8=BF=87=E6=9C=9F=E5=9B=9E=E5=A4=8D=E8=A6=86=E7=9B=96?= =?UTF-8?q?=20=E7=8A=B6=E6=80=81=E4=BA=92=E6=96=A5=E4=BF=9D=E6=8A=A4=20-?= =?UTF-8?q?=20AI=E7=94=9F=E6=88=90=20=E2=87=84=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E4=BA=92=E6=96=A5=20=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E9=98=B2=E6=8A=96=20-=203=E7=A7=92=E5=BB=B6=E8=BF=9F=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=A4=9A=E6=9D=A1=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/MessageEnter/index.tsx | 48 ++++- Touchkebao/src/store/module/weChat/weChat.ts | 171 +++++++++++++++--- 2 files changed, 191 insertions(+), 28 deletions(-) diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx index 06bfc121..074f5459 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx @@ -16,7 +16,10 @@ import SimpleFileUpload from "@/components/Upload/SimpleFileUpload"; import AudioRecorder from "@/components/Upload/AudioRecorder"; import ToContract from "./components/toContract"; import styles from "./MessageEnter.module.scss"; -import { useWeChatStore } from "@/store/module/weChat/weChat"; +import { + useWeChatStore, + clearAiRequestQueue, +} from "@/store/module/weChat/weChat"; import { useContactStore } from "@/store/module/weChat/contacts"; const { Footer } = Layout; const { TextArea } = Input; @@ -63,6 +66,8 @@ const MessageEnter: React.FC = ({ contract }) => { // 取消AI生成 const handleCancelAi = () => { + // 清除AI请求定时器和队列 + clearAiRequestQueue("用户手动取消"); // 停止AI加载状态 updateIsLoadingAiChat(false); // 清空AI回复内容 @@ -70,6 +75,22 @@ const MessageEnter: React.FC = ({ contract }) => { message.info("已取消AI生成"); }; + // 监听输入框变化 - 用户开始输入时取消AI + const handleInputChange = (e: React.ChangeEvent) => { + const newValue = e.target.value; + setInputValue(newValue); + + // 如果用户开始输入(且不是AI填充的内容),取消AI请求 + if (newValue && newValue !== quoteMessageContent) { + if (isLoadingAiChat) { + console.log("👤 用户开始输入,取消AI生成"); + clearAiRequestQueue("用户开始输入"); + updateIsLoadingAiChat(false); + updateQuoteMessageContent(""); + } + } + }; + // 发送消息(支持传入内容参数,避免闭包问题) const handleSend = async (content?: string) => { const messageContent = content || inputValue; // 优先使用传入的内容 @@ -79,6 +100,13 @@ const MessageEnter: React.FC = ({ contract }) => { return; } + // 用户主动发送消息时,取消AI请求 + if (!content && isLoadingAiChat) { + console.log("👤 用户主动发送消息,取消AI生成"); + clearAiRequestQueue("用户主动发送"); + updateIsLoadingAiChat(false); + } + console.log("handleSend", messageContent); const messageId = +Date.now(); // 构造本地消息对象 @@ -128,17 +156,27 @@ const MessageEnter: React.FC = ({ contract }) => { // AI 消息处理 useEffect(() => { if (quoteMessageContent) { - console.log("AI消息到达 - aiQuoteMessageContent:", aiQuoteMessageContent); + console.log( + "🤖 AI消息到达 - aiQuoteMessageContent:", + aiQuoteMessageContent, + ); + + // 检查:如果用户输入框已有内容(且不是之前的AI内容),不覆盖 + if (inputValue && inputValue !== quoteMessageContent) { + console.log("⚠️ 用户正在输入,不覆盖输入内容"); + updateQuoteMessageContent(""); // 清空AI回复 + return; + } if (isAiAssist) { // AI辅助模式:填充到输入框,等待人工确认 - console.log("AI辅助模式:填充消息到输入框"); + console.log("✨ AI辅助模式:填充消息到输入框"); setInputValue(quoteMessageContent); } if (isAiTakeover) { // AI接管模式:直接发送消息(传入内容,避免 state 闭包问题) - console.log("AI接管模式:自动发送消息"); + console.log("🚀 AI接管模式:自动发送消息"); handleSend(quoteMessageContent); } } @@ -354,7 +392,7 @@ const MessageEnter: React.FC = ({ contract }) => {