/** * 检查数据库中的模板状态 * * 只读操作,不会修改任何数据 * * 使用方法: * npx ts-node scripts/check-templates.ts */ import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() // 内置模板ID列表 const BUILTIN_TEMPLATE_IDS = [ 'builtin-3dmax-material', 'builtin-psd-material', 'builtin-audio-material', 'builtin-video-material', 'builtin-model-material', 'builtin-other-material', ] async function checkTemplates() { console.log('=' .repeat(60)) console.log('数据库模板状态检查') console.log('=' .repeat(60)) console.log() try { // 1. 检查所有模板 console.log('【1. 所有模板列表】') const allTemplates = await prisma.uploadTemplate.findMany({ select: { id: true, name: true, status: true, materialType: true, createdAt: true, }, orderBy: { createdAt: 'asc' } }) console.log(`总数: ${allTemplates.length} 个模板\n`) if (allTemplates.length > 0) { allTemplates.forEach((t, i) => { const isBuiltin = t.id.startsWith('builtin-') const tag = isBuiltin ? '[内置]' : '[自定义]' console.log(` ${i + 1}. ${tag} ${t.id}`) console.log(` 名称: ${t.name}`) console.log(` 状态: ${t.status}`) console.log(` 类型: ${t.materialType}`) console.log() }) } else { console.log(' (无模板记录)\n') } // 2. 检查内置模板 console.log('【2. 内置模板检查】') const existingBuiltinIds = new Set( allTemplates.filter(t => t.id.startsWith('builtin-')).map(t => t.id) ) console.log(`需要的内置模板: ${BUILTIN_TEMPLATE_IDS.length} 个`) console.log(`已存在的内置模板: ${existingBuiltinIds.size} 个\n`) BUILTIN_TEMPLATE_IDS.forEach(id => { const exists = existingBuiltinIds.has(id) const status = exists ? '✓ 存在' : '✗ 缺失' console.log(` ${status} - ${id}`) }) console.log() // 3. 检查自定义模板 const customTemplates = allTemplates.filter(t => !t.id.startsWith('builtin-')) console.log('【3. 自定义模板】') console.log(`总数: ${customTemplates.length} 个\n`) if (customTemplates.length > 0) { customTemplates.forEach((t, i) => { console.log(` ${i + 1}. ${t.name} (${t.id})`) console.log(` 状态: ${t.status}, 类型: ${t.materialType}`) }) } else { console.log(' (无自定义模板)') } console.log() // 4. 检查素材引用的模板 console.log('【4. 素材模板引用统计】') const materialStats = await prisma.material.groupBy({ by: ['templateId'], _count: { id: true }, where: { deletedAt: null } }) console.log(`有 ${materialStats.length} 种不同的模板ID被素材引用\n`) for (const stat of materialStats) { const templateId = stat.templateId || '(无模板)' const count = stat._count.id // 检查模板是否存在 let status = '' if (!stat.templateId) { status = '⚠ 无模板ID' } else if (existingBuiltinIds.has(stat.templateId)) { status = '✓ 内置模板存在' } else { const exists = allTemplates.some(t => t.id === stat.templateId) status = exists ? '✓ 自定义模板存在' : '✗ 模板不存在' } console.log(` ${templateId}: ${count} 个素材 - ${status}`) } console.log() // 5. 总结 console.log('=' .repeat(60)) console.log('总结') console.log('=' .repeat(60)) const missingBuiltin = BUILTIN_TEMPLATE_IDS.filter(id => !existingBuiltinIds.has(id)) if (missingBuiltin.length === 0) { console.log('✓ 所有内置模板都已存在,无需修复') } else { console.log(`✗ 缺失 ${missingBuiltin.length} 个内置模板:`) missingBuiltin.forEach(id => console.log(` - ${id}`)) console.log() console.log('建议运行修复脚本: npx ts-node scripts/fix-missing-templates.ts') } } catch (error) { console.error('检查失败:', error) } finally { await prisma.$disconnect() } } // 执行检查 checkTemplates()