check-book-outline.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. const { PrismaClient } = require('@prisma/client');
  2. const prisma = new PrismaClient();
  3. async function checkBookOutline() {
  4. try {
  5. const book = await prisma.book.findUnique({
  6. where: { id: 1 },
  7. include: {
  8. chapters: {
  9. orderBy: [
  10. { level: 'asc' },
  11. { number: 'asc' }
  12. ]
  13. }
  14. }
  15. });
  16. if (!book) {
  17. console.log('❌ 书籍不存在 (id=1)');
  18. return;
  19. }
  20. console.log('📖 书籍信息:');
  21. console.log(` ID: ${book.id}`);
  22. console.log(` 标题: ${book.title}`);
  23. console.log(` 状态: ${book.status}`);
  24. console.log(` 进度: ${book.progress}%`);
  25. console.log(` 章节数: ${book.totalChapters}`);
  26. console.log('');
  27. // 检查大纲
  28. if (book.outlineJson) {
  29. const outline = JSON.parse(book.outlineJson);
  30. console.log('✅ 大纲已生成:');
  31. console.log(` 主题: ${outline.mainTheme}`);
  32. console.log(` 结构逻辑: ${outline.structureLogic}`);
  33. console.log(` 章节数: ${outline.chapters?.length || 0}`);
  34. console.log('');
  35. } else {
  36. console.log('❌ 大纲未生成');
  37. console.log('');
  38. }
  39. // 统计各级章节
  40. const level1 = book.chapters.filter(c => c.level === 1);
  41. const level2 = book.chapters.filter(c => c.level === 2);
  42. const level3 = book.chapters.filter(c => c.level === 3);
  43. console.log('📊 章节统计:');
  44. console.log(` 章 (level=1): ${level1.length}`);
  45. console.log(` 节 (level=2): ${level2.length}`);
  46. console.log(` 小节 (level=3): ${level3.length}`);
  47. console.log('');
  48. // 检查大纲状态
  49. const outlineStatus = {
  50. pending: book.chapters.filter(c => c.status === 'pending').length,
  51. completed: book.chapters.filter(c => c.status === 'completed').length,
  52. failed: book.chapters.filter(c => c.status === 'failed').length,
  53. };
  54. console.log('📋 大纲状态 (status字段):');
  55. console.log(` 待生成: ${outlineStatus.pending}`);
  56. console.log(` 已完成: ${outlineStatus.completed}`);
  57. console.log(` 失败: ${outlineStatus.failed}`);
  58. console.log('');
  59. // 检查内容生成状态
  60. const contentStatus = {
  61. null: book.chapters.filter(c => c.contentStatus === null).length,
  62. pending: book.chapters.filter(c => c.contentStatus === 'pending').length,
  63. generating: book.chapters.filter(c => c.contentStatus === 'generating').length,
  64. completed: book.chapters.filter(c => c.contentStatus === 'completed').length,
  65. failed: book.chapters.filter(c => c.contentStatus === 'failed').length,
  66. };
  67. console.log('📝 内容生成状态 (contentStatus字段):');
  68. console.log(` 未开始: ${contentStatus.null}`);
  69. console.log(` 待生成: ${contentStatus.pending}`);
  70. console.log(` 生成中: ${contentStatus.generating}`);
  71. console.log(` 已完成: ${contentStatus.completed}`);
  72. console.log(` 失败: ${contentStatus.failed}`);
  73. console.log('');
  74. // 显示章列表
  75. if (level1.length > 0) {
  76. console.log('📚 章节列表:');
  77. level1.forEach(chapter => {
  78. console.log(` ${chapter.number}. ${chapter.title} [${chapter.status}]`);
  79. // 显示该章下的节
  80. const sections = book.chapters.filter(c => c.parentId === chapter.id && c.level === 2);
  81. sections.forEach(section => {
  82. console.log(` ${section.number}. ${section.title} [${section.status}]`);
  83. // 显示该节下的小节
  84. const subsections = book.chapters.filter(c => c.parentId === section.id && c.level === 3);
  85. subsections.forEach(sub => {
  86. const contentMark = sub.contentStatus === 'completed' ? '✅' : sub.contentStatus === 'failed' ? '❌' : '⏳';
  87. console.log(` ${sub.number}. ${sub.title} [${sub.contentStatus || 'null'}] ${contentMark}`);
  88. });
  89. });
  90. });
  91. }
  92. } catch (error) {
  93. console.error('错误:', error);
  94. } finally {
  95. await prisma.$disconnect();
  96. }
  97. }
  98. checkBookOutline();