#!/usr/bin/env node // 一次性导入浙江省油价历史 (2025-2026) // 来源: 手工整理 (省发改委公告 / 潮新闻 / 钱江晚报 / 杭州日报 / 杭州网 等) // 用法: node --experimental-strip-types --no-warnings scripts/import-oil-history.mjs [--dry] import path from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' import 'dotenv/config' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const ROOT = path.resolve(__dirname, '..') // 接入 prisma (用 file:// URL 避免 Windows 绝对路径 import 报错) const adapterMod = await import('@prisma/adapter-mariadb') const clientPath = pathToFileURL(path.join(ROOT, 'generated/prisma/client.ts')).href const { PrismaClient } = await import(clientPath) const adapter = new adapterMod.PrismaMariaDb((() => { const u = new URL(process.env.DATABASE_URL) return { host: u.hostname, port: Number(u.port) || 3306, user: decodeURIComponent(u.username), password: decodeURIComponent(u.password), database: u.pathname.replace(/^\//, ''), } })()) const prisma = new PrismaClient({ adapter }) // 数据: [调价日, 92, 95, 0, source] const RAW = [ ['2026-07-31', 7.94, 8.44, 7.62, 'manual'], ['2026-07-17', 7.39, 7.86, 7.06, 'manual'], ['2026-06-18', 7.91, 8.41, 7.59, 'manual'], ['2026-06-04', 8.32, 8.85, 8.02, 'manual'], ['2026-05-21', 8.74, 9.30, 8.45, 'manual'], ['2026-02-03', 6.91, 7.35, 6.56, 'manual'], ['2025-12-22', 6.68, 7.11, 6.32, 'manual'], ['2025-12-08', 6.82, 7.25, 6.46, 'manual'], ['2025-11-24', 6.86, null, null, 'manual'], ['2025-11-10', 6.92, 7.36, 6.57, 'manual'], ['2025-10-13', 7.03, 7.48, 6.68, 'manual'], ['2025-06-17', 7.15, 7.60, 6.81, 'manual'], ['2025-06-03', 6.94, 7.38, 6.59, 'manual'], ] const PROVINCE = '浙江' const FUEL_COLS = [ { fuel: '92', idx: 1 }, { fuel: '95', idx: 2 }, { fuel: '0', idx: 3 }, ] const DRY = process.argv.includes('--dry') async function main() { console.log('=== 浙江省油价历史导入 ===') console.log('dry run:', DRY) console.log('') let inserted = 0 let updated = 0 let skipped = 0 for (const row of RAW) { const dateStr = row[0] const source = row[4] for (const { fuel, idx } of FUEL_COLS) { const price = row[idx] if (price == null || Number.isNaN(price)) { console.log('[SKIP] ' + dateStr + ' ' + fuel + ': 价格为空') skipped++ continue } const date = new Date(dateStr + 'T00:00:00') if (DRY) { console.log('[DRY] ' + dateStr + ' ' + fuel + ' = ' + price + ' (source=' + source + ')') inserted++ continue } try { await prisma.oilPriceHistory.create({ data: { date, province: PROVINCE, fuel, price, source }, }) console.log('[OK] ' + dateStr + ' ' + fuel + ' = ' + price) inserted++ } catch (e) { if (e?.code === 'P2002') { try { await prisma.oilPriceHistory.update({ where: { date_province_fuel: { date, province: PROVINCE, fuel } }, data: { price, source }, }) console.log('[UPD] ' + dateStr + ' ' + fuel + ' = ' + price) updated++ } catch (e2) { console.log('[ERR] ' + dateStr + ' ' + fuel + ': ' + e2.message) } } else { console.log('[ERR] ' + dateStr + ' ' + fuel + ': ' + e.message) } } } } console.log('') console.log('=== 汇总 ===') console.log('插入: ' + inserted) console.log('更新: ' + updated) console.log('跳过: ' + skipped) await prisma.$disconnect() } main().catch((e) => { console.error(e) process.exit(1) })