From 5372c05c3737660d56b9c65364e56955afd7a906 Mon Sep 17 00:00:00 2001 From: digua Date: Mon, 12 Jan 2026 00:02:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main/worker/core/dbCore.ts | 12 +++-- electron/main/worker/query/messages.ts | 63 ++++++++++++++------------ 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/electron/main/worker/core/dbCore.ts b/electron/main/worker/core/dbCore.ts index e1b36826..c7453019 100644 --- a/electron/main/worker/core/dbCore.ts +++ b/electron/main/worker/core/dbCore.ts @@ -86,17 +86,22 @@ export interface TimeFilter { /** * 构建时间过滤 WHERE 子句 + * @param filter 时间过滤器 + * @param tableAlias 表别名,用于多表 JOIN 场景避免列名歧义(如 'msg') */ -export function buildTimeFilter(filter?: TimeFilter): { clause: string; params: number[] } { +export function buildTimeFilter(filter?: TimeFilter, tableAlias?: string): { clause: string; params: number[] } { const conditions: string[] = [] const params: number[] = [] + // 构建带别名的列名(如 'msg.ts' 或 'ts') + const tsColumn = tableAlias ? `${tableAlias}.ts` : 'ts' + if (filter?.startTs !== undefined) { - conditions.push('ts >= ?') + conditions.push(`${tsColumn} >= ?`) params.push(filter.startTs) } if (filter?.endTs !== undefined) { - conditions.push('ts <= ?') + conditions.push(`${tsColumn} <= ?`) params.push(filter.endTs) } @@ -119,4 +124,3 @@ export function buildSystemMessageFilter(existingClause: string): string { return ' WHERE ' + systemFilter } } - diff --git a/electron/main/worker/query/messages.ts b/electron/main/worker/query/messages.ts index 84978e4e..beabb753 100644 --- a/electron/main/worker/query/messages.ts +++ b/electron/main/worker/query/messages.ts @@ -117,7 +117,7 @@ function buildKeywordCondition(keywords?: string[]): { condition: string; params const SYSTEM_FILTER = "AND COALESCE(m.account_name, '') != '系统消息'" // 只获取文本消息的过滤条件 -const TEXT_ONLY_FILTER = 'AND msg.type = 0 AND msg.content IS NOT NULL AND msg.content != \'\'' +const TEXT_ONLY_FILTER = "AND msg.type = 0 AND msg.content IS NOT NULL AND msg.content != ''" // ==================== 查询函数 ==================== @@ -127,19 +127,15 @@ const TEXT_ONLY_FILTER = 'AND msg.type = 0 AND msg.content IS NOT NULL AND msg.c * @param filter 时间过滤器 * @param limit 返回数量限制 */ -export function getRecentMessages( - sessionId: string, - filter?: TimeFilter, - limit: number = 100 -): MessagesWithTotal { +export function getRecentMessages(sessionId: string, filter?: TimeFilter, limit: number = 100): MessagesWithTotal { // 确保数据库有 avatar 字段(兼容旧数据库) ensureAvatarColumn(sessionId) const db = openDatabase(sessionId) if (!db) return { messages: [], total: 0 } - // 构建时间过滤条件 - const { clause: timeClause, params: timeParams } = buildTimeFilter(filter) + // 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义) + const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg') const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : '' // 查询总数 @@ -196,19 +192,15 @@ export function getRecentMessages( * @param filter 时间过滤器 * @param limit 返回数量限制 */ -export function getAllRecentMessages( - sessionId: string, - filter?: TimeFilter, - limit: number = 100 -): MessagesWithTotal { +export function getAllRecentMessages(sessionId: string, filter?: TimeFilter, limit: number = 100): MessagesWithTotal { // 确保数据库有 avatar 字段(兼容旧数据库) ensureAvatarColumn(sessionId) const db = openDatabase(sessionId) if (!db) return { messages: [], total: 0 } - // 构建时间过滤条件 - const { clause: timeClause, params: timeParams } = buildTimeFilter(filter) + // 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义) + const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg') const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : '' // 查询总数 @@ -286,8 +278,8 @@ export function searchMessages( keywordParams.push(...keywords.map((k) => `%${k}%`)) } - // 构建时间过滤条件 - const { clause: timeClause, params: timeParams } = buildTimeFilter(filter) + // 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义) + const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg') const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : '' // 构建发送者筛选条件 @@ -445,8 +437,8 @@ export function getMessagesBefore( const db = openDatabase(sessionId) if (!db) return { messages: [], hasMore: false } - // 构建时间过滤条件 - const { clause: timeClause, params: timeParams } = buildTimeFilter(filter) + // 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义) + const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg') const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : '' // 构建关键词条件 @@ -480,7 +472,9 @@ export function getMessagesBefore( LIMIT ? ` - const rows = db.prepare(sql).all(beforeId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[] + const rows = db + .prepare(sql) + .all(beforeId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[] const hasMore = rows.length > limit const resultRows = hasMore ? rows.slice(0, limit) : rows @@ -515,8 +509,8 @@ export function getMessagesAfter( const db = openDatabase(sessionId) if (!db) return { messages: [], hasMore: false } - // 构建时间过滤条件 - const { clause: timeClause, params: timeParams } = buildTimeFilter(filter) + // 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义) + const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg') const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : '' // 构建关键词条件 @@ -550,7 +544,9 @@ export function getMessagesAfter( LIMIT ? ` - const rows = db.prepare(sql).all(afterId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[] + const rows = db + .prepare(sql) + .all(afterId, ...timeParams, ...keywordParams, ...senderParams, limit + 1) as DbMessageRow[] const hasMore = rows.length > limit const resultRows = hasMore ? rows.slice(0, limit) : rows @@ -584,22 +580,30 @@ export function getConversationBetween( if (!db) return { messages: [], total: 0, member1Name: '', member2Name: '' } // 获取成员名称 - const member1 = db.prepare(` + const member1 = db + .prepare( + ` SELECT COALESCE(group_nickname, account_name, platform_id) as name FROM member WHERE id = ? - `).get(memberId1) as { name: string } | undefined + ` + ) + .get(memberId1) as { name: string } | undefined - const member2 = db.prepare(` + const member2 = db + .prepare( + ` SELECT COALESCE(group_nickname, account_name, platform_id) as name FROM member WHERE id = ? - `).get(memberId2) as { name: string } | undefined + ` + ) + .get(memberId2) as { name: string } | undefined if (!member1 || !member2) { return { messages: [], total: 0, member1Name: '', member2Name: '' } } - // 构建时间过滤条件 - const { clause: timeClause, params: timeParams } = buildTimeFilter(filter) + // 构建时间过滤条件(使用 'msg' 表别名避免多表 JOIN 时的列名歧义) + const { clause: timeClause, params: timeParams } = buildTimeFilter(filter, 'msg') const timeCondition = timeClause ? timeClause.replace('WHERE', 'AND') : '' // 查询两人之间的所有消息 @@ -649,4 +653,3 @@ export function getConversationBetween( member2Name: member2.name, } } -