mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-05-06 13:06:09 +08:00
fix: 修复windows用户自定义筛选时消息量过大导致软件崩溃的BUG
This commit is contained in:
@@ -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) }
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
// 处理消息
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
// ==================== 增量导入 ====================
|
||||
|
||||
Reference in New Issue
Block a user