/** * 将 legacy common_city.partner_id 迁移至 common_city_partner(CITY_WIDE)。 * 在 prisma db push 移除 partner_id 列之前运行;若列已不存在则跳过数据拷贝。 * * 用法:cd server/dukang-api && pnpm prisma:migrate-city-partner */ import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function columnExists(table: string, column: string): Promise { const rows = await prisma.$queryRawUnsafe>( `SELECT COUNT(*) AS cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`, table, column, ); return Number(rows[0]?.cnt ?? 0) > 0; } async function main() { const hasPartnerId = await columnExists('common_city', 'partner_id'); if (!hasPartnerId) { console.log('[migrate-city-partner] common_city.partner_id 已移除,跳过迁移'); return; } const cities = await prisma.$queryRawUnsafe< Array<{ id: bigint; partner_id: bigint | null }> >(`SELECT id, partner_id FROM common_city WHERE partner_id IS NOT NULL`); let migrated = 0; for (const row of cities) { const cityId = row.id; const partnerId = row.partner_id!; const existing = await prisma.cityPartner.findFirst({ where: { cityId, partnerId }, }); if (existing) continue; const rule = await prisma.commonCityCommissionRule.findUnique({ where: { cityId } }); await prisma.cityPartner.create({ data: { cityId, partnerId, scopeType: 'CITY_WIDE', orderCommissionRate: rule ? Number((rule as { orderCommissionRate?: unknown }).orderCommissionRate ?? 0) : 0, redeemCommissionRate: rule ? Number((rule as { redeemCommissionRate?: unknown }).redeemCommissionRate ?? 0.03) : 0.03, status: 'ACTIVE', }, }); migrated += 1; } console.log(`[migrate-city-partner] 已迁移 ${migrated} 条 CITY_WIDE 绑定`); } main() .catch((err) => { console.error(err); process.exit(1); }) .finally(() => prisma.$disconnect());