diff --git a/web2/src/components/common/ChatPanel.tsx b/web2/src/components/common/ChatPanel.tsx index 23e0562..f11b16f 100644 --- a/web2/src/components/common/ChatPanel.tsx +++ b/web2/src/components/common/ChatPanel.tsx @@ -285,6 +285,10 @@ export function ChatPanel({ const [loading, setLoading] = useState(false) const [dynamicSamples, setDynamicSamples] = useState(samples) const [refreshing, setRefreshing] = useState(false) + /** 当天热点问题池(从后端加载的全部问题)和当前批次起始索引 */ + const [dailyPool, setDailyPool] = useState([]) + const [poolIndex, setPoolIndex] = useState(0) + const BATCH_SIZE = 12 // ===== 2.0 新增:案卡状态 ===== const [matterId, setMatterId] = useState(null) @@ -402,12 +406,14 @@ export function ChatPanel({ setDynamicSamples(samples) }, [samples]) - /** 挂载时取当天热点问题,有则覆盖兜底示例 */ + /** 挂载时取当天热点问题,有则存入池并显示首批 */ useEffect(() => { api.getDailyTopics(scene) .then((res) => { if (res.questions?.length > 0) { - setDynamicSamples(res.questions) + setDailyPool(res.questions) + setPoolIndex(0) + setDynamicSamples(res.questions.slice(0, BATCH_SIZE)) } }) .catch(() => {/* 用兜底示例 */}) @@ -545,13 +551,26 @@ export function ChatPanel({ }, answers.length > 0 ? answers : undefined) } - /** AI 换一批示例问题(注入用户画像,个性化推荐) */ + /** 换一批:优先从当天热点池轮换,池用完再调 AI 生成(注入用户画像) */ const handleRefreshSamples = async () => { + // 池里还有未展示的,直接取下一批 + const nextIndex = poolIndex + BATCH_SIZE + if (dailyPool.length > 0 && nextIndex < dailyPool.length) { + setPoolIndex(nextIndex) + setDynamicSamples(dailyPool.slice(nextIndex, nextIndex + BATCH_SIZE)) + return + } + // 池用完,调 AI 生成新问题 setRefreshing(true) try { const phone = getPhone() || undefined const res = await api.generateSamples(scene, topic, dynamicSamples, phone) - setDynamicSamples(res.samples) + if (res.samples?.length > 0) { + setDynamicSamples(res.samples) + // AI 生成的新问题加入池,重置索引 + setDailyPool(prev => [...prev, ...res.samples]) + setPoolIndex(dailyPool.length) + } } catch { toast.error('换一批失败,请稍后重试') } finally {