package main import ( "database/sql" "time" ) func SeedSlotsAndExhibits(db *sql.DB) error { ts := time.Now().UnixMilli() expire := ts + 4*3600*1000 // 4 小时 tx, err := db.Begin() if err != nil { return err } defer tx.Rollback() // 1. booth_slots: 每 user 3 个, is_enabled=true slotStmt, err := tx.Prepare(` INSERT INTO booth_slots (host_profile_id, user_id, star_id, slot_index, is_enabled, created_at, updated_at) SELECT fp.id, fp.user_id, fp.star_id, idx, true, $1, $1 FROM fan_profiles fp CROSS JOIN (VALUES (1),(2),(3)) AS s(idx) WHERE fp.star_id = $2 ON CONFLICT DO NOTHING `) if err != nil { return err } defer slotStmt.Close() if _, err := slotStmt.Exec(ts, LoadtestStarID); err != nil { return err } // 2. exhibitions: 把每个 user 的前 2 个 asset 上架到 slot 1, 2 exStmt, err := tx.Prepare(` INSERT INTO exhibitions (asset_id, slot_id, host_profile_id, occupier_uid, occupier_star_id, start_time, expire_at, created_at, updated_at) SELECT a.id, bs.slot_id, fp.id, a.owner_uid, $1, $2, $3, $2, $2 FROM assets a JOIN fan_profiles fp ON a.owner_uid = fp.user_id AND fp.star_id = $1 JOIN booth_slots bs ON bs.host_profile_id = fp.id AND (bs.slot_index = $4 OR bs.slot_index = $5) WHERE a.star_id = $1 AND (a.name LIKE '%_1' OR a.name LIKE '%_2') ON CONFLICT DO NOTHING `) if err != nil { return err } defer exStmt.Close() // asset 1 → slot 1 if _, err := exStmt.Exec(LoadtestStarID, ts, expire, 1, 2); err != nil { return err } return tx.Commit() }