package httpapi import ( "context" "database/sql" "errors" ) func (s *server) lookupID(ctx context.Context, query string, args ...any) (int64, error) { var id int64 if err := s.ev.QueryRowContext(ctx, query, args...).Scan(&id); err != nil { return 0, err } return id, nil } // upsertImportedEntry 按「组别 + 单位 + 运动员」去重;返回 true 表示新建。 func (s *server) upsertImportedEntry(ctx context.Context, in entryDTO) (bool, error) { var existing int64 var err error if in.AthleteID != nil { err = s.ev.QueryRowContext(ctx, `SELECT id FROM entries WHERE category_id = ? AND team_id = ? AND athlete_id = ?`, in.CategoryID, in.TeamID, *in.AthleteID).Scan(&existing) } else { err = s.ev.QueryRowContext(ctx, `SELECT id FROM entries WHERE category_id = ? AND team_id = ? AND athlete_id IS NULL`, in.CategoryID, in.TeamID).Scan(&existing) } switch { case errors.Is(err, sql.ErrNoRows): if _, err := s.ev.ExecContext(ctx, `INSERT INTO entries (event_id, category_id, team_id, athlete_id, member_names, bib, seed, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, in.EventID, in.CategoryID, in.TeamID, nullI64(in.AthleteID), marshalNames(in.MemberNames), nullStr(in.Bib), nullStr(in.Seed), orDefault(in.Status, "registered")); err != nil { return false, err } return true, nil case err != nil: return false, err default: if _, err := s.ev.ExecContext(ctx, `UPDATE entries SET member_names = ?, bib = ?, seed = ?, status = ? WHERE id = ?`, marshalNames(in.MemberNames), nullStr(in.Bib), nullStr(in.Seed), orDefault(in.Status, "registered"), existing); err != nil { return false, err } return false, nil } }