/** * 一次性脚本:从 mock API 回填过去 N 天的营收事件。 * 同时给所有项目自动 seed project_revenue_mapping(identifier 作 businessProjectKey)。 * 用法: bun run scripts/backfill-revenue.ts [days=60] */ import { v4 as uuid } from 'uuid'; import dayjs from 'dayjs'; import { eq, inArray } from 'drizzle-orm'; import { db } from '../src/db/index'; import { projects, projectRevenueMapping } from '../src/db/schema'; import { runRevenueIngest } from '../src/services/roi/revenue-ingest'; const days = Number(process.argv[2] || 60); // 1. seed mapping: identifier → projectId(没有就建) const all = await db.select().from(projects); const existing = await db.select().from(projectRevenueMapping); const existingKeys = new Set(existing.map(m => m.businessProjectKey)); const toInsert = all .filter(p => p.identifier && !existingKeys.has(p.identifier)) .map(p => ({ id: uuid(), projectId: p.id, businessProjectKey: p.identifier!, enabled: 1, notes: 'auto-seeded', createdAt: new Date(), updatedAt: new Date(), })); if (toInsert.length > 0) { await db.insert(projectRevenueMapping).values(toInsert); console.log(`Seeded ${toInsert.length} project mappings`); } // 2. 逐日拉 mock 数据 for (let i = days; i >= 0; i--) { const date = dayjs().subtract(i, 'day').format('YYYY-MM-DD'); await runRevenueIngest(date); if (i % 10 === 0) console.log(` → ${date}`); } console.log('Done.'); process.exit(0);