diff --git a/electron/main/ai/conversations.ts b/electron/main/ai/conversations.ts index 8f41c44..402065f 100644 --- a/electron/main/ai/conversations.ts +++ b/electron/main/ai/conversations.ts @@ -172,6 +172,25 @@ export function createConversation(sessionId: string, title?: string): AIConvers /** * 获取会话的所有对话列表 */ +/** + * 获取所有会话的 AI 对话计数(按 session_id 分组) + */ +export function getConversationCountsBySession(): Map { + const result = new Map() + try { + const db = getAiDb() + const rows = db + .prepare('SELECT session_id, COUNT(*) as count FROM ai_conversation GROUP BY session_id') + .all() as Array<{ session_id: string; count: number }> + for (const row of rows) { + result.set(row.session_id, row.count) + } + } catch { + // AI 数据库可能尚未初始化 + } + return result +} + export function getConversations(sessionId: string): AIConversation[] { const db = getAiDb() diff --git a/electron/main/ipc/chat.ts b/electron/main/ipc/chat.ts index 6b06724..a2aaf2f 100644 --- a/electron/main/ipc/chat.ts +++ b/electron/main/ipc/chat.ts @@ -255,6 +255,18 @@ export function registerChatHandlers(ctx: IpcContext): void { ipcMain.handle('chat:getSessions', async () => { try { const sessions = await worker.getAllSessions() + + // 填充 AI 对话计数(AI 数据库在主进程管理) + try { + const { getConversationCountsBySession } = await import('../ai/conversations') + const aiCounts = getConversationCountsBySession() + for (const session of sessions) { + session.aiConversationCount = aiCounts.get(session.id) || 0 + } + } catch { + // AI 数据库未初始化时忽略 + } + return sessions } catch (error) { console.error('[IpcMain] Error getting sessions:', error) diff --git a/electron/main/worker/query/sessions.ts b/electron/main/worker/query/sessions.ts index 24b91ad..dc8f2c3 100644 --- a/electron/main/worker/query/sessions.ts +++ b/electron/main/worker/query/sessions.ts @@ -120,6 +120,23 @@ export function getAllSessions(): any[] { memberAvatar = getPrivateChatMemberAvatar(db, meta.name, meta.owner_id) } + // 摘要数量:安全查询(chat_session 表可能不存在) + let summaryCount = 0 + try { + const hasChatSessionTable = db + .prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='chat_session'") + .get() as { cnt: number } + if (hasChatSessionTable.cnt > 0) { + summaryCount = ( + db + .prepare("SELECT COUNT(*) as count FROM chat_session WHERE summary IS NOT NULL AND summary != ''") + .get() as { count: number } + ).count + } + } catch { + // 忽略查询错误 + } + sessions.push({ id: sessionId, name: meta.name, @@ -133,6 +150,8 @@ export function getAllSessions(): any[] { groupAvatar: meta.group_avatar || null, ownerId: meta.owner_id || null, memberAvatar, // 私聊对方头像 + summaryCount, + aiConversationCount: 0, // 将在 IPC 层由主进程填充 }) } diff --git a/src/i18n/locales/en-US/tools.json b/src/i18n/locales/en-US/tools.json index a9e0076..92a9087 100644 --- a/src/i18n/locales/en-US/tools.json +++ b/src/i18n/locales/en-US/tools.json @@ -26,6 +26,8 @@ "name": "Name", "platform": "Platform", "messages": "Messages", + "summaries": "Summaries", + "aiChats": "AI Chats", "importedAt": "Imported" }, "clickToEdit": "Click to edit name", diff --git a/src/i18n/locales/zh-CN/tools.json b/src/i18n/locales/zh-CN/tools.json index 366f8e4..75fa4fa 100644 --- a/src/i18n/locales/zh-CN/tools.json +++ b/src/i18n/locales/zh-CN/tools.json @@ -26,6 +26,8 @@ "name": "名称", "platform": "平台", "messages": "消息数", + "summaries": "摘要", + "aiChats": "AI 对话", "importedAt": "导入时间" }, "clickToEdit": "点击编辑名称", diff --git a/src/pages/manage/components/BatchManageTab.vue b/src/pages/manage/components/BatchManageTab.vue index e1045c7..f6c28cd 100644 --- a/src/pages/manage/components/BatchManageTab.vue +++ b/src/pages/manage/components/BatchManageTab.vue @@ -443,6 +443,8 @@ onMounted(() => {
{{ t('tools.batchManage.columns.name') }}
{{ t('tools.batchManage.columns.platform') }}
{{ t('tools.batchManage.columns.messages') }}
+
{{ t('tools.batchManage.columns.summaries') }}
+
{{ t('tools.batchManage.columns.aiChats') }}
{{ t('tools.batchManage.columns.importedAt') }}
@@ -525,6 +527,16 @@ onMounted(() => { {{ session.messageCount.toLocaleString() }} + +
+ {{ session.summaryCount || 0 }} +
+ + +
+ {{ session.aiConversationCount || 0 }} +
+
{{ formatTime(session.importedAt) }} diff --git a/src/pages/manage/index.vue b/src/pages/manage/index.vue index 5d8f434..92a65d5 100644 --- a/src/pages/manage/index.vue +++ b/src/pages/manage/index.vue @@ -9,7 +9,12 @@ const { t } = useI18n()