import { NestFactory } from '@nestjs/core'; import { AppModule } from '../app.module'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { BidItem } from '../bids/entities/bid-item.entity'; import { CustomLogger } from '../common/logger/logger.service'; async function removeDuplicates() { const app = await NestFactory.createApplicationContext(AppModule); // 设置自定义 logger const logger = await app.resolve(CustomLogger); app.useLogger(logger); logger.setContext('RemoveDuplicatesScript'); try { // 获取 BidItem 的 repository const bidItemRepository = app.get>(getRepositoryToken(BidItem)); logger.log('开始查找重复的title...'); // 查找所有重复的title const duplicates = await bidItemRepository .createQueryBuilder('bid') .select('bid.title', 'title') .addSelect('COUNT(*)', 'count') .groupBy('bid.title') .having('COUNT(*) > 1') .getRawMany(); if (duplicates.length === 0) { logger.log('没有发现重复的title'); await app.close(); process.exit(0); } logger.log(`发现 ${duplicates.length} 个重复的title`); let totalDeleted = 0; // 对每个重复的title,只保留最晚创建的一条记录 for (const duplicate of duplicates) { const title = duplicate.title; const count = duplicate.count; logger.log(`处理重复title: "${title}" (共 ${count} 条)`); // 获取该title的所有记录,按创建时间降序排列 const items = await bidItemRepository .createQueryBuilder('bid') .where('bid.title = :title', { title }) .orderBy('bid.createdAt', 'DESC') .getMany(); // 保留第一条(最晚创建的),删除其余的 const itemsToDelete = items.slice(1); if (itemsToDelete.length > 0) { const idsToDelete = itemsToDelete.map(item => item.id); const deleteResult = await bidItemRepository.delete(idsToDelete); totalDeleted += deleteResult.affected || 0; logger.log(` 删除了 ${deleteResult.affected} 条重复记录,保留ID: ${items[0].id} (最晚创建)`); } } logger.log(`总共删除了 ${totalDeleted} 条重复记录`); await app.close(); process.exit(0); } catch (error) { logger.error('删除重复记录失败:', error); await app.close(); process.exit(1); } } removeDuplicates();