test-dual-status.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const { PrismaClient } = require('@prisma/client');
  2. const prisma = new PrismaClient();
  3. async function testStatus() {
  4. console.log('=== 测试双阶段状态管理 ===\n');
  5. // 查询最新的书籍
  6. const book = await prisma.book.findFirst({
  7. orderBy: { id: 'desc' },
  8. include: {
  9. chapters: {
  10. orderBy: [{ level: 'asc' }, { number: 'asc' }]
  11. }
  12. }
  13. });
  14. if (!book) {
  15. console.log('❌ 未找到测试书籍');
  16. return;
  17. }
  18. console.log(`📖 书籍: ${book.title} (id=${book.id})`);
  19. console.log(`状态: ${book.status}\n`);
  20. // 统计各级节点
  21. const level1Chapters = book.chapters.filter(c => c.level === 1);
  22. const level2Chapters = book.chapters.filter(c => c.level === 2);
  23. const level3Chapters = book.chapters.filter(c => c.level === 3);
  24. console.log(`📊 统计:`);
  25. console.log(` 章(level=1): ${level1Chapters.length} 个`);
  26. console.log(` 节(level=2): ${level2Chapters.length} 个`);
  27. console.log(` 小节(level=3): ${level3Chapters.length} 个\n`);
  28. // 检查status字段(大纲状态)
  29. console.log(`📝 大纲状态 (status):`);
  30. const statusStats = {
  31. pending: book.chapters.filter(c => c.status === 'pending').length,
  32. completed: book.chapters.filter(c => c.status === 'completed').length,
  33. failed: book.chapters.filter(c => c.status === 'failed').length,
  34. };
  35. console.log(` completed: ${statusStats.completed}`);
  36. console.log(` pending: ${statusStats.pending}`);
  37. console.log(` failed: ${statusStats.failed}\n`);
  38. // 检查contentStatus字段(内容状态)
  39. console.log(`📄 内容状态 (contentStatus):`);
  40. const contentStats = {
  41. null: book.chapters.filter(c => c.contentStatus === null).length,
  42. pending: book.chapters.filter(c => c.contentStatus === 'pending').length,
  43. generating: book.chapters.filter(c => c.contentStatus === 'generating').length,
  44. completed: book.chapters.filter(c => c.contentStatus === 'completed').length,
  45. failed: book.chapters.filter(c => c.contentStatus === 'failed').length,
  46. };
  47. console.log(` null (未开始): ${contentStats['null']}`);
  48. console.log(` pending: ${contentStats.pending}`);
  49. console.log(` generating: ${contentStats.generating}`);
  50. console.log(` completed: ${contentStats.completed}`);
  51. console.log(` failed: ${contentStats.failed}\n`);
  52. // 显示前2个小节的详细信息
  53. if (level3Chapters.length > 0) {
  54. console.log(`🔍 示例小节 (前2个):`);
  55. level3Chapters.slice(0, 2).forEach((c, i) => {
  56. console.log(`\n ${i + 1}. ${c.title}`);
  57. console.log(` level: ${c.level}`);
  58. console.log(` status (大纲): ${c.status}`);
  59. console.log(` contentStatus (内容): ${c.contentStatus || 'null'}`);
  60. console.log(` content: ${c.content ? `有 (${c.wordCount}字)` : '无'}`);
  61. });
  62. }
  63. // 验证断点续传逻辑
  64. console.log(`\n✅ 断点续传验证:`);
  65. const leafNodes = level3Chapters;
  66. const completedLeafNodes = leafNodes.filter(c => c.contentStatus === 'completed');
  67. const pendingLeafNodes = leafNodes.filter(c => c.contentStatus !== 'completed');
  68. console.log(` 叶节点总数: ${leafNodes.length}`);
  69. console.log(` 已完成内容: ${completedLeafNodes.length} (应跳过)`);
  70. console.log(` 待生成内容: ${pendingLeafNodes.length} (应生成)`);
  71. if (completedLeafNodes.length > 0 && pendingLeafNodes.length > 0) {
  72. console.log(` ✅ 断点续传逻辑正确:能区分已完成和待生成`);
  73. } else if (completedLeafNodes.length === 0 && pendingLeafNodes.length > 0) {
  74. console.log(` ℹ️ 内容还未开始生成`);
  75. }
  76. await prisma.$disconnect();
  77. }
  78. testStatus().catch(console.error);