65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
/**
|
||
* 将 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<boolean> {
|
||
const rows = await prisma.$queryRawUnsafe<Array<{ cnt: bigint }>>(
|
||
`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());
|