Procházet zdrojové kódy

fix: 修复章大纲状态 - 创建时标记为completed而非pending

MyFramework User před 4 měsíci
rodič
revize
38f8a666d4

+ 113 - 0
server/check-book-outline.js

@@ -0,0 +1,113 @@
+const { PrismaClient } = require('@prisma/client');
+const prisma = new PrismaClient();
+
+async function checkBookOutline() {
+  try {
+    const book = await prisma.book.findUnique({
+      where: { id: 1 },
+      include: {
+        chapters: {
+          orderBy: [
+            { level: 'asc' },
+            { number: 'asc' }
+          ]
+        }
+      }
+    });
+
+    if (!book) {
+      console.log('❌ 书籍不存在 (id=1)');
+      return;
+    }
+
+    console.log('📖 书籍信息:');
+    console.log(`  ID: ${book.id}`);
+    console.log(`  标题: ${book.title}`);
+    console.log(`  状态: ${book.status}`);
+    console.log(`  进度: ${book.progress}%`);
+    console.log(`  章节数: ${book.totalChapters}`);
+    console.log('');
+
+    // 检查大纲
+    if (book.outlineJson) {
+      const outline = JSON.parse(book.outlineJson);
+      console.log('✅ 大纲已生成:');
+      console.log(`  主题: ${outline.mainTheme}`);
+      console.log(`  结构逻辑: ${outline.structureLogic}`);
+      console.log(`  章节数: ${outline.chapters?.length || 0}`);
+      console.log('');
+    } else {
+      console.log('❌ 大纲未生成');
+      console.log('');
+    }
+
+    // 统计各级章节
+    const level1 = book.chapters.filter(c => c.level === 1);
+    const level2 = book.chapters.filter(c => c.level === 2);
+    const level3 = book.chapters.filter(c => c.level === 3);
+
+    console.log('📊 章节统计:');
+    console.log(`  章 (level=1): ${level1.length}`);
+    console.log(`  节 (level=2): ${level2.length}`);
+    console.log(`  小节 (level=3): ${level3.length}`);
+    console.log('');
+
+    // 检查大纲状态
+    const outlineStatus = {
+      pending: book.chapters.filter(c => c.status === 'pending').length,
+      completed: book.chapters.filter(c => c.status === 'completed').length,
+      failed: book.chapters.filter(c => c.status === 'failed').length,
+    };
+
+    console.log('📋 大纲状态 (status字段):');
+    console.log(`  待生成: ${outlineStatus.pending}`);
+    console.log(`  已完成: ${outlineStatus.completed}`);
+    console.log(`  失败: ${outlineStatus.failed}`);
+    console.log('');
+
+    // 检查内容生成状态
+    const contentStatus = {
+      null: book.chapters.filter(c => c.contentStatus === null).length,
+      pending: book.chapters.filter(c => c.contentStatus === 'pending').length,
+      generating: book.chapters.filter(c => c.contentStatus === 'generating').length,
+      completed: book.chapters.filter(c => c.contentStatus === 'completed').length,
+      failed: book.chapters.filter(c => c.contentStatus === 'failed').length,
+    };
+
+    console.log('📝 内容生成状态 (contentStatus字段):');
+    console.log(`  未开始: ${contentStatus.null}`);
+    console.log(`  待生成: ${contentStatus.pending}`);
+    console.log(`  生成中: ${contentStatus.generating}`);
+    console.log(`  已完成: ${contentStatus.completed}`);
+    console.log(`  失败: ${contentStatus.failed}`);
+    console.log('');
+
+    // 显示章列表
+    if (level1.length > 0) {
+      console.log('📚 章节列表:');
+      level1.forEach(chapter => {
+        console.log(`  ${chapter.number}. ${chapter.title} [${chapter.status}]`);
+        
+        // 显示该章下的节
+        const sections = book.chapters.filter(c => c.parentId === chapter.id && c.level === 2);
+        sections.forEach(section => {
+          console.log(`    ${section.number}. ${section.title} [${section.status}]`);
+          
+          // 显示该节下的小节
+          const subsections = book.chapters.filter(c => c.parentId === section.id && c.level === 3);
+          subsections.forEach(sub => {
+            const contentMark = sub.contentStatus === 'completed' ? '✅' : sub.contentStatus === 'failed' ? '❌' : '⏳';
+            console.log(`      ${sub.number}. ${sub.title} [${sub.contentStatus || 'null'}] ${contentMark}`);
+          });
+        });
+      });
+    }
+
+  } catch (error) {
+    console.error('错误:', error);
+  } finally {
+    await prisma.$disconnect();
+  }
+}
+
+checkBookOutline();

+ 33 - 0
server/check-users.js

@@ -0,0 +1,33 @@
+const { PrismaClient } = require('@prisma/client');
+const prisma = new PrismaClient();
+
+async function checkUsers() {
+  try {
+    const users = await prisma.user.findMany();
+    console.log('用户总数:', users.length);
+    console.log('用户列表:');
+    users.forEach(u => {
+      console.log(`  ID: ${u.id}, 手机: ${u.phone}, 会员等级: ${u.memberLevel}`);
+    });
+    
+    if (users.length === 0) {
+      console.log('\n数据库为空,需要创建测试用户...');
+      // 创建测试用户
+      const testUser = await prisma.user.create({
+        data: {
+          phone: '13812341234',
+          memberLevel: 0,
+          dailyUsage: 0,
+          lastUsageDate: new Date().toISOString().slice(0, 10)
+        }
+      });
+      console.log('✅ 测试用户创建成功:', testUser);
+    }
+  } catch (error) {
+    console.error('错误:', error);
+  } finally {
+    await prisma.$disconnect();
+  }
+}
+
+checkUsers();

+ 2 - 2
server/src/modules/book-generator/book-generator.store.ts

@@ -266,8 +266,8 @@ export class BookStore {
           summary: c.summary,
           keyPoints: c.keyPoints ? JSON.stringify(c.keyPoints) : null,
           estimatedWords: c.estimatedWords || 5000,
-          status: 'pending',
-        },
+          status: 'completed', // 大纲已完成
+        } as any,
       });
     }
   }

+ 28 - 0
server/update-member.js

@@ -0,0 +1,28 @@
+const { PrismaClient } = require('@prisma/client');
+const prisma = new PrismaClient();
+
+async function updateMemberLevel() {
+  try {
+    const user = await prisma.user.update({
+      where: { id: 1 },
+      data: { 
+        memberLevel: 2,
+        memberExpireAt: new Date('2027-12-31') // 设置到期时间
+      }
+    });
+    
+    console.log('✅ 会员等级已更新为2(年度会员 - 无限制)');
+    console.log('用户信息:');
+    console.log(`  ID: ${user.id}`);
+    console.log(`  手机: ${user.phone}`);
+    console.log(`  会员等级: ${user.memberLevel}`);
+    console.log(`  到期时间: ${user.memberExpireAt}`);
+    console.log(`  每日使用: ${user.dailyUsage}`);
+  } catch (error) {
+    console.error('错误:', error);
+  } finally {
+    await prisma.$disconnect();
+  }
+}
+
+updateMemberLevel();