|
|
@@ -11,6 +11,7 @@ import { PublishService } from './PublishService.js';
|
|
|
import { XiaohongshuWorkNoteStatisticsImportService } from './XiaohongshuWorkNoteStatisticsImportService.js';
|
|
|
import { DouyinWorkStatisticsImportService } from './DouyinWorkStatisticsImportService.js';
|
|
|
import { BaijiahaoWorkDailyStatisticsImportService } from './BaijiahaoWorkDailyStatisticsImportService.js';
|
|
|
+import { WeixinVideoWorkStatisticsImportService } from './WeixinVideoWorkStatisticsImportService.js';
|
|
|
import { AppDataSource, PlatformAccount } from '../models/index.js';
|
|
|
import { logger } from '../utils/logger.js';
|
|
|
|
|
|
@@ -348,6 +349,43 @@ async function bjWorkStatsBackfillExecutor(task: Task, updateProgress: ProgressU
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 视频号作品日统计/快照补数(不阻塞同步作品)
|
|
|
+ * 任务 data: { workIds: number[] }
|
|
|
+ */
|
|
|
+async function wxWorkStatsBackfillExecutor(task: Task, updateProgress: ProgressUpdater): Promise<TaskResult> {
|
|
|
+ updateProgress({ progress: 5, currentStep: '准备视频号作品补数任务...' });
|
|
|
+
|
|
|
+ const userId = (task as Task & { userId?: number }).userId;
|
|
|
+ if (!userId) throw new Error('缺少用户ID');
|
|
|
+ if (!task.accountId) throw new Error('缺少账号ID');
|
|
|
+
|
|
|
+ const data = task as Task & { data?: { workIds?: unknown }; workIds?: unknown };
|
|
|
+ const workIdsRaw = data.workIds ?? data.data?.workIds;
|
|
|
+ const workIds = Array.isArray(workIdsRaw)
|
|
|
+ ? workIdsRaw.map((x) => Number(x)).filter((n) => Number.isFinite(n) && n > 0)
|
|
|
+ : [];
|
|
|
+ if (!workIds.length) throw new Error('缺少 workIds');
|
|
|
+
|
|
|
+ const account = await AppDataSource.getRepository(PlatformAccount).findOne({
|
|
|
+ where: { id: task.accountId, userId, platform: 'weixin_video' as any },
|
|
|
+ });
|
|
|
+ if (!account) throw new Error('未找到视频号账号或无权限');
|
|
|
+
|
|
|
+ const total = workIds.length;
|
|
|
+ updateProgress({ progress: 15, currentStep: `开始视频号作品补数(作品数:${total})...`, totalSteps: total });
|
|
|
+
|
|
|
+ await WeixinVideoWorkStatisticsImportService.runDailyImportForAccount(account.id, false, workIds);
|
|
|
+
|
|
|
+ updateProgress({ progress: 100, currentStep: '视频号作品补数完成' });
|
|
|
+
|
|
|
+ return {
|
|
|
+ success: true,
|
|
|
+ message: `视频号作品补数完成,作品数:${workIds.length}`,
|
|
|
+ data: { workIdsCount: workIds.length },
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
* 注册所有任务执行器
|
|
|
*/
|
|
|
export function registerTaskExecutors(): void {
|
|
|
@@ -359,6 +397,7 @@ export function registerTaskExecutors(): void {
|
|
|
taskQueueService.registerExecutor('xhs_work_stats_backfill', xhsWorkStatsBackfillExecutor);
|
|
|
taskQueueService.registerExecutor('dy_work_stats_backfill', dyWorkStatsBackfillExecutor);
|
|
|
taskQueueService.registerExecutor('bj_work_stats_backfill', bjWorkStatsBackfillExecutor);
|
|
|
+ taskQueueService.registerExecutor('wx_work_stats_backfill', wxWorkStatsBackfillExecutor);
|
|
|
|
|
|
logger.info('All task executors registered');
|
|
|
}
|