2025-01-24 00:19:02 +08:00
|
|
|
import { InjectQueue } from '@nestjs/bullmq';
|
|
|
|
import { Injectable } from '@nestjs/common';
|
|
|
|
import EventBus from '@server/utils/event-bus';
|
|
|
|
import { Queue } from 'bullmq';
|
|
|
|
import { ObjectType } from '@nice/common';
|
|
|
|
import { QueueJobType } from '../types';
|
2025-01-03 09:24:46 +08:00
|
|
|
@Injectable()
|
|
|
|
export class StatsService {
|
2025-01-24 00:19:02 +08:00
|
|
|
constructor(@InjectQueue('general') private generalQueue: Queue) {
|
|
|
|
EventBus.on('dataChanged', async ({ type, data }) => {
|
|
|
|
const jobOptions = {
|
|
|
|
removeOnComplete: true,
|
|
|
|
jobId: this.generateJobId(type as ObjectType, data), // 使用唯一ID防止重复任务
|
|
|
|
};
|
|
|
|
switch (type) {
|
|
|
|
case ObjectType.ENROLLMENT:
|
|
|
|
await this.generalQueue.add(
|
|
|
|
QueueJobType.UPDATE_STATS,
|
|
|
|
{
|
|
|
|
courseId: data.courseId,
|
|
|
|
type: ObjectType.ENROLLMENT,
|
|
|
|
},
|
|
|
|
jobOptions,
|
|
|
|
);
|
|
|
|
break;
|
2025-01-03 09:24:46 +08:00
|
|
|
|
2025-01-24 00:19:02 +08:00
|
|
|
case ObjectType.LECTURE:
|
|
|
|
await this.generalQueue.add(
|
|
|
|
QueueJobType.UPDATE_STATS,
|
|
|
|
{
|
|
|
|
sectionId: data.sectionId,
|
|
|
|
courseId: data.courseId,
|
|
|
|
type: ObjectType.LECTURE,
|
|
|
|
},
|
|
|
|
jobOptions,
|
|
|
|
);
|
|
|
|
break;
|
2025-01-03 09:24:46 +08:00
|
|
|
|
2025-01-24 00:19:02 +08:00
|
|
|
case ObjectType.POST:
|
|
|
|
if (data.courseId) {
|
|
|
|
await this.generalQueue.add(
|
|
|
|
QueueJobType.UPDATE_STATS,
|
|
|
|
{
|
|
|
|
courseId: data.courseId,
|
|
|
|
type: ObjectType.POST,
|
|
|
|
},
|
|
|
|
jobOptions,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2025-01-03 09:24:46 +08:00
|
|
|
|
2025-01-24 00:19:02 +08:00
|
|
|
private generateJobId(type: ObjectType, data: any): string {
|
|
|
|
// 根据类型和相关ID生成唯一的job标识
|
|
|
|
switch (type) {
|
|
|
|
case ObjectType.ENROLLMENT:
|
|
|
|
return `stats_${type}_${data.courseId}`;
|
|
|
|
case ObjectType.LECTURE:
|
|
|
|
return `stats_${type}_${data.courseId}_${data.sectionId}`;
|
|
|
|
case ObjectType.POST:
|
|
|
|
return `stats_${type}_${data.courseId}`;
|
|
|
|
default:
|
|
|
|
return `stats_${type}_${Date.now()}`;
|
2025-01-03 09:24:46 +08:00
|
|
|
}
|
2025-01-24 00:19:02 +08:00
|
|
|
}
|
|
|
|
}
|