mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-05-06 21:16:10 +08:00
feat: 优化总览
This commit is contained in:
@@ -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 []
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
/**
|
||||
* 获取消息类型分布
|
||||
*/
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -13,6 +13,7 @@ export {
|
||||
getHourlyActivity,
|
||||
getDailyActivity,
|
||||
getWeekdayActivity,
|
||||
getMonthlyActivity,
|
||||
getMessageTypeDistribution,
|
||||
getTimeRange,
|
||||
getMemberNameHistory,
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user