feat: 优化总览

This commit is contained in:
digua
2025-11-30 02:13:33 +08:00
parent d10ecdf2ba
commit 03ec49bc7e
8 changed files with 158 additions and 50 deletions
+15
View File
@@ -344,6 +344,21 @@ const mainIpcMain = (win: BrowserWindow) => {
}
)
/**
* 获取月份活跃度分布
*/
ipcMain.handle(
'chat:getMonthlyActivity',
async (_, sessionId: string, filter?: { startTs?: number; endTs?: number }) => {
try {
return await worker.getMonthlyActivity(sessionId, filter)
} catch (error) {
console.error('获取月份活跃度失败:', error)
return []
}
}
)
/**
* 获取消息类型分布
*/
+2
View File
@@ -17,6 +17,7 @@ import {
getHourlyActivity,
getDailyActivity,
getWeekdayActivity,
getMonthlyActivity,
getMessageTypeDistribution,
getTimeRange,
getMemberNameHistory,
@@ -53,6 +54,7 @@ const handlers: Record<string, (payload: any) => any> = {
getHourlyActivity: (p) => getHourlyActivity(p.sessionId, p.filter),
getDailyActivity: (p) => getDailyActivity(p.sessionId, p.filter),
getWeekdayActivity: (p) => getWeekdayActivity(p.sessionId, p.filter),
getMonthlyActivity: (p) => getMonthlyActivity(p.sessionId, p.filter),
getMessageTypeDistribution: (p) => getMessageTypeDistribution(p.sessionId, p.filter),
getTimeRange: (p) => getTimeRange(p.sessionId),
getMemberNameHistory: (p) => getMemberNameHistory(p.sessionId, p.memberId),
+1
View File
@@ -13,6 +13,7 @@ export {
getHourlyActivity,
getDailyActivity,
getWeekdayActivity,
getMonthlyActivity,
getMessageTypeDistribution,
getTimeRange,
getMemberNameHistory,
+39 -13
View File
@@ -6,14 +6,7 @@
import Database from 'better-sqlite3'
import * as fs from 'fs'
import * as path from 'path'
import {
openDatabase,
getDbDir,
getDbPath,
buildTimeFilter,
buildSystemMessageFilter,
type TimeFilter,
} from './dbCore'
import { openDatabase, getDbDir, getDbPath, buildTimeFilter, buildSystemMessageFilter, type TimeFilter } from './dbCore'
// ==================== 基础查询 ====================
@@ -198,6 +191,43 @@ export function getWeekdayActivity(sessionId: string, filter?: TimeFilter): any[
return result
}
/**
* 获取月份活跃度分布
*/
export function getMonthlyActivity(sessionId: string, filter?: TimeFilter): any[] {
const db = openDatabase(sessionId)
if (!db) return []
const { clause, params } = buildTimeFilter(filter)
const clauseWithSystem = buildSystemMessageFilter(clause)
const rows = db
.prepare(
`
SELECT
CAST(strftime('%m', msg.ts, 'unixepoch', 'localtime') AS INTEGER) as month,
COUNT(*) as messageCount
FROM message msg
JOIN member m ON msg.sender_id = m.id
${clauseWithSystem}
GROUP BY month
ORDER BY month
`
)
.all(...params) as Array<{ month: number; messageCount: number }>
const result: any[] = []
for (let m = 1; m <= 12; m++) {
const found = rows.find((r) => r.month === m)
result.push({
month: m,
messageCount: found ? found.messageCount : 0,
})
}
return result
}
/**
* 获取消息类型分布
*/
@@ -250,10 +280,7 @@ export function getTimeRange(sessionId: string): { start: number; end: number }
/**
* 获取成员的历史昵称记录
*/
export function getMemberNameHistory(
sessionId: string,
memberId: number
): any[] {
export function getMemberNameHistory(sessionId: string, memberId: number): any[] {
const db = openDatabase(sessionId)
if (!db) return []
@@ -386,4 +413,3 @@ export function getSession(sessionId: string): any | null {
dbPath: getDbPath(sessionId),
}
}
+4
View File
@@ -191,6 +191,10 @@ export async function getWeekdayActivity(sessionId: string, filter?: any): Promi
return sendToWorker('getWeekdayActivity', { sessionId, filter })
}
export async function getMonthlyActivity(sessionId: string, filter?: any): Promise<any[]> {
return sendToWorker('getMonthlyActivity', { sessionId, filter })
}
export async function getMessageTypeDistribution(sessionId: string, filter?: any): Promise<any[]> {
return sendToWorker('getMessageTypeDistribution', { sessionId, filter })
}