poll-book43.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // 轮询 book 43 状态直到完成或失败
  2. const { PrismaClient } = require('@prisma/client');
  3. const p = new PrismaClient();
  4. const POLL_INTERVAL = 30 * 1000; // 30s
  5. const MAX_WAIT = 30 * 60 * 1000; // 30 分钟
  6. (async () => {
  7. const start = Date.now();
  8. let lastSnapshot = '';
  9. while (Date.now() - start < MAX_WAIT) {
  10. await new Promise(r => setTimeout(r, POLL_INTERVAL));
  11. const elapsed = Math.round((Date.now() - start) / 1000);
  12. const b = await p.book.findUnique({
  13. where: { id: 43 },
  14. select: { id: true, genStage: true, failedStage: true, errorMsg: true, progress: true, totalChapters: true, updatedAt: true },
  15. });
  16. const chapters = await p.bookChapter.count({ where: { bookId: 43 } });
  17. const completedChapters = await p.bookChapter.count({
  18. where: { bookId: 43, genStage: { in: ['content_completed', 'audio_completed', 'video_completed'] } },
  19. });
  20. const snapshot = `${b.genStage}|${b.progress}|${chapters}|${completedChapters}|${b.failedStage || ''}|${b.errorMsg || ''}`;
  21. if (snapshot !== lastSnapshot) {
  22. console.log(`[${elapsed}s] ${snapshot}`);
  23. lastSnapshot = snapshot;
  24. }
  25. if (b.genStage === 'content_completed' || b.genStage === 'audio_completed' || b.genStage === 'video_completed') {
  26. console.log(`\n✅ 成功完成!genStage=${b.genStage}, progress=${b.progress}, chapters=${chapters}/${completedChapters} 已完成`);
  27. break;
  28. }
  29. if (b.genStage === 'failed') {
  30. console.log(`\n❌ 生成失败`);
  31. console.log('failedStage:', b.failedStage);
  32. console.log('errorMsg:', b.errorMsg);
  33. break;
  34. }
  35. }
  36. await p.$disconnect();
  37. process.exit(0);
  38. })();