fix: 修复windows用户自定义筛选时消息量过大导致软件崩溃的BUG

This commit is contained in:
digua
2026-02-02 23:51:12 +08:00
committed by digua
parent 38738eb090
commit 878507ba8a
13 changed files with 588 additions and 109 deletions
+64 -12
View File
@@ -149,7 +149,7 @@ export function registerMessagesHandlers({ win }: IpcContext): void {
// ==================== 自定义筛选 ====================
/**
* 按条件筛选消息并扩充上下文
* 按条件筛选消息并扩充上下文(支持分页)
*/
ipcMain.handle(
'ai:filterMessagesWithContext',
@@ -159,26 +159,78 @@ export function registerMessagesHandlers({ win }: IpcContext): void {
keywords?: string[],
timeFilter?: { startTs: number; endTs: number },
senderIds?: number[],
contextSize?: number
contextSize?: number,
page?: number,
pageSize?: number
) => {
try {
return await worker.filterMessagesWithContext(sessionId, keywords, timeFilter, senderIds, contextSize)
return await worker.filterMessagesWithContext(
sessionId,
keywords,
timeFilter,
senderIds,
contextSize,
page,
pageSize
)
} catch (error) {
console.error('筛选消息失败:', error)
return { blocks: [], stats: { totalMessages: 0, hitMessages: 0, totalChars: 0 } }
return {
blocks: [],
stats: { totalMessages: 0, hitMessages: 0, totalChars: 0 },
pagination: { page: page ?? 1, pageSize: pageSize ?? 50, totalBlocks: 0, totalHits: 0, hasMore: false },
}
}
}
)
/**
* 获取多个会话的完整消息
* 获取多个会话的完整消息(支持分页)
*/
ipcMain.handle('ai:getMultipleSessionsMessages', async (_, sessionId: string, chatSessionIds: number[]) => {
try {
return await worker.getMultipleSessionsMessages(sessionId, chatSessionIds)
} catch (error) {
console.error('获取多个会话消息失败:', error)
return { blocks: [], stats: { totalMessages: 0, hitMessages: 0, totalChars: 0 } }
ipcMain.handle(
'ai:getMultipleSessionsMessages',
async (_, sessionId: string, chatSessionIds: number[], page?: number, pageSize?: number) => {
try {
return await worker.getMultipleSessionsMessages(sessionId, chatSessionIds, page, pageSize)
} catch (error) {
console.error('获取多个会话消息失败:', error)
return {
blocks: [],
stats: { totalMessages: 0, hitMessages: 0, totalChars: 0 },
pagination: { page: page ?? 1, pageSize: pageSize ?? 50, totalBlocks: 0, totalHits: 0, hasMore: false },
}
}
}
})
)
/**
* 导出筛选结果到文件(后端生成,支持进度)
*/
ipcMain.handle(
'ai:exportFilterResultToFile',
async (
_,
params: {
sessionId: string
sessionName: string
outputDir: string
filterMode: 'condition' | 'session'
keywords?: string[]
timeFilter?: { startTs: number; endTs: number }
senderIds?: number[]
contextSize?: number
chatSessionIds?: number[]
}
) => {
try {
return await worker.exportFilterResultToFile(params, (progress) => {
// 发送进度到渲染进程
win.webContents.send('ai:exportProgress', progress)
})
} catch (error) {
console.error('导出筛选结果失败:', error)
return { success: false, error: String(error) }
}
}
)
}
+7 -3
View File
@@ -62,6 +62,7 @@ import {
// 自定义筛选
filterMessagesWithContext,
getMultipleSessionsMessages,
exportFilterResultToFile,
// NLP 查询
getWordFrequency,
segmentText,
@@ -148,10 +149,11 @@ const syncHandlers: Record<string, (payload: any) => any> = {
searchSessions: (p) => searchSessions(p.sessionId, p.keywords, p.timeFilter, p.limit, p.previewCount),
getSessionMessages: (p) => getSessionMessages(p.sessionId, p.chatSessionId, p.limit),
// 自定义筛选
// 自定义筛选(支持分页)
filterMessagesWithContext: (p) =>
filterMessagesWithContext(p.sessionId, p.keywords, p.timeFilter, p.senderIds, p.contextSize),
getMultipleSessionsMessages: (p) => getMultipleSessionsMessages(p.sessionId, p.chatSessionIds),
filterMessagesWithContext(p.sessionId, p.keywords, p.timeFilter, p.senderIds, p.contextSize, p.page, p.pageSize),
getMultipleSessionsMessages: (p) =>
getMultipleSessionsMessages(p.sessionId, p.chatSessionIds, p.page, p.pageSize),
// NLP 查询
getWordFrequency: (p) => getWordFrequency(p),
@@ -168,6 +170,8 @@ const asyncHandlers: Record<string, (payload: any, requestId: string) => Promise
// 增量导入
analyzeIncrementalImport: (p, id) => analyzeIncrementalImport(p.sessionId, p.filePath, id),
incrementalImport: (p, id) => incrementalImport(p.sessionId, p.filePath, id),
// 导出筛选结果到文件(支持进度报告)
exportFilterResultToFile: async (p, id) => exportFilterResultToFile(p, id),
}
// 处理消息
+80 -10
View File
@@ -122,7 +122,7 @@ export function initWorker(): void {
/**
* 发送消息到 Worker 并等待响应
*/
function sendToWorker<T>(type: string, payload: any): Promise<T> {
function sendToWorker<T>(type: string, payload: any, timeoutMs: number = 30000): Promise<T> {
return new Promise((resolve, reject) => {
if (!worker) {
try {
@@ -139,13 +139,13 @@ function sendToWorker<T>(type: string, payload: any): Promise<T> {
worker!.postMessage({ id, type, payload })
// 设置超时30秒)
// 设置超时
setTimeout(() => {
if (pendingRequests.has(id)) {
pendingRequests.delete(id)
reject(new Error(`Worker request timeout: ${type}`))
}
}, 30000)
}, timeoutMs)
})
}
@@ -810,23 +810,93 @@ export interface FilterResult {
}
/**
* 按条件筛选消息并扩充上下文
* 分页信息类型
*/
export interface PaginationInfo {
page: number
pageSize: number
totalBlocks: number
totalHits: number
hasMore: boolean
}
/**
* 带分页的筛选结果类型
*/
export interface FilterResultWithPagination extends FilterResult {
pagination: PaginationInfo
}
/**
* 按条件筛选消息并扩充上下文(支持分页)
*/
export async function filterMessagesWithContext(
sessionId: string,
keywords?: string[],
timeFilter?: { startTs: number; endTs: number },
senderIds?: number[],
contextSize?: number
): Promise<FilterResult> {
return sendToWorker('filterMessagesWithContext', { sessionId, keywords, timeFilter, senderIds, contextSize })
contextSize?: number,
page?: number,
pageSize?: number
): Promise<FilterResultWithPagination> {
return sendToWorker('filterMessagesWithContext', {
sessionId,
keywords,
timeFilter,
senderIds,
contextSize,
page,
pageSize,
})
}
/**
* 获取多个会话的完整消息
* 获取多个会话的完整消息(支持分页)
*/
export async function getMultipleSessionsMessages(sessionId: string, chatSessionIds: number[]): Promise<FilterResult> {
return sendToWorker('getMultipleSessionsMessages', { sessionId, chatSessionIds })
export async function getMultipleSessionsMessages(
sessionId: string,
chatSessionIds: number[],
page?: number,
pageSize?: number
): Promise<FilterResultWithPagination> {
return sendToWorker('getMultipleSessionsMessages', { sessionId, chatSessionIds, page, pageSize })
}
/**
* 导出筛选结果参数
*/
export interface ExportFilterParams {
sessionId: string
sessionName: string
outputDir: string
filterMode: 'condition' | 'session'
keywords?: string[]
timeFilter?: { startTs: number; endTs: number }
senderIds?: number[]
contextSize?: number
chatSessionIds?: number[]
}
/**
* 导出进度回调类型
*/
export interface ExportProgress {
stage: 'preparing' | 'exporting' | 'done' | 'error'
currentBlock: number
totalBlocks: number
percentage: number
message: string
}
/**
* 导出筛选结果到文件(后端生成)
* 使用 10 分钟超时,支持大数据量导出和进度回调
*/
export async function exportFilterResultToFile(
params: ExportFilterParams,
onProgress?: (progress: ExportProgress) => void
): Promise<{ success: boolean; filePath?: string; error?: string }> {
return sendToWorkerWithProgress('exportFilterResultToFile', params, onProgress as any, 600000)
}
// ==================== 增量导入 ====================