Files
bidding_watcher/src/scripts/remove-duplicates.ts
dmy 5024d2c502 feat: 添加重复投标项目清理脚本并更新相关逻辑
更新依赖版本,移除调试日志,修改静态文件排除规则,将投标项目查重逻辑从URL改为标题,并添加清理重复投标项目的脚本
2026-01-13 00:39:43 +08:00

78 lines
2.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();