feat(admin): Implement operational monitoring MVP and login optimization
Summary: - Add SimpleLog table for activity tracking (admin_schema) - Implement ActivityService with fire-and-forget pattern - Add stats API endpoints (overview/live-feed/user-overview/cleanup) - Complete activity logging for 7 modules (SYSTEM/AIA/PKB/ASL/DC/RVW/IIT) - Update Admin Dashboard with DAU/DAT metrics and live feed - Fix user module permission display logic - Fix login redirect to /ai-qa instead of homepage - Replace top navigation LOGO with brand image - Fix PKB workspace layout CSS conflict (rename to .pa-chat-container) New files: - backend/src/common/services/activity.service.ts - backend/src/modules/admin/controllers/statsController.ts - backend/src/modules/admin/routes/statsRoutes.ts - frontend-v2/src/modules/admin/api/statsApi.ts - docs/03-.../04-operational-monitoring-mvp-plan.md - docs/03-.../04-operational-monitoring-mvp-implementation.md Tested: All features verified locally
This commit is contained in:
@@ -13,6 +13,7 @@ import { llmScreeningService } from './llmScreeningService.js';
|
||||
import { jobQueue } from '../../../common/jobs/index.js';
|
||||
import { CheckpointService } from '../../../common/jobs/CheckpointService.js';
|
||||
import type { Job } from '../../../common/jobs/types.js';
|
||||
import { activityService } from '../../../common/services/activity.service.js';
|
||||
|
||||
// 创建断点服务实例
|
||||
const checkpointService = new CheckpointService(prisma);
|
||||
@@ -123,7 +124,7 @@ export function registerScreeningWorkers() {
|
||||
|
||||
if (completedBatches >= totalBatches) {
|
||||
// 所有批次完成,标记任务为完成
|
||||
await prisma.aslScreeningTask.update({
|
||||
const task = await prisma.aslScreeningTask.update({
|
||||
where: { id: taskId },
|
||||
data: {
|
||||
status: 'completed',
|
||||
@@ -131,8 +132,35 @@ export function registerScreeningWorkers() {
|
||||
},
|
||||
});
|
||||
|
||||
// 获取项目信息用于埋点
|
||||
const project = await prisma.project.findUnique({
|
||||
where: { id: task.projectId },
|
||||
});
|
||||
|
||||
logger.info('All batches completed, task marked as completed', { taskId });
|
||||
console.log(`\n🎉 任务 ${taskId} 全部完成!\n`);
|
||||
|
||||
// 埋点:记录文献筛选完成
|
||||
try {
|
||||
if (project) {
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: project.userId },
|
||||
include: { tenants: true }
|
||||
});
|
||||
if (user) {
|
||||
activityService.log(
|
||||
user.tenant_id,
|
||||
user.tenants?.name || null,
|
||||
user.id,
|
||||
user.name,
|
||||
'ASL',
|
||||
'文献筛选',
|
||||
'USE',
|
||||
`项目:${project.name}, 文献:${totalBatches * 10}篇`
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) { /* 埋点失败不影响主业务 */ }
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user