78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
|
|
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<Repository<BidItem>>(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();
|