package repository import ( "database/sql" "fmt" "log" "strings" "kfz-goods-pricing/internal/database" ) // KfzToken Token记录 type KfzToken struct { ID int64 LoginName string Username string Password string Token string IsEnable bool } // TokenRepository Token仓储 type TokenRepository struct{} // NewTokenRepository 创建Token仓储实例 func NewTokenRepository() *TokenRepository { return &TokenRepository{} } // BatchInsert 批量插入Token记录 func (r *TokenRepository) BatchInsert(tokens []string, username string) (int64, error) { if len(tokens) == 0 { return 0, nil } var validTokens []string for _, t := range tokens { t := strings.TrimSpace(t) if t != "" { validTokens = append(validTokens, t) } } if len(validTokens) == 0 { return 0, nil } valuePlaceholders := make([]string, len(validTokens)) args := make([]interface{}, 0, len(validTokens)*2) for i, t := range validTokens { valuePlaceholders[i] = "(?, ?, 1)" args = append(args, username, t) } query := fmt.Sprintf("INSERT INTO kfz_token (username, token, is_enable) VALUES %s", strings.Join(valuePlaceholders, ",")) result, err := database.DB.Exec(query, args...) if err != nil { return 0, fmt.Errorf("批量插入失败: %w", err) } id, err := result.LastInsertId() if err != nil { return 0, fmt.Errorf("获取自增ID失败: %w", err) } return id, nil } // Insert 插入单条Token记录 func (r *TokenRepository) Insert(loginName, username, password, token string, isEnable bool) (int64, error) { query := `INSERT INTO kfz_token (login_name, username, password, token, is_enable) VALUES (?, ?, ?, ?, ?)` result, err := database.DB.Exec(query, loginName, username, password, token, isEnable) if err != nil { return 0, fmt.Errorf("插入失败: %w", err) } id, err := result.LastInsertId() if err != nil { return 0, fmt.Errorf("获取自增ID失败: %w", err) } return id, nil } // UpsertByLoginName 根据登录名插入或更新记录 func (r *TokenRepository) UpsertByLoginName(loginName, username, password, token string) error { var count int err := database.DB.QueryRow("SELECT COUNT(*) FROM kfz_token WHERE login_name = ?", loginName).Scan(&count) if err != nil { return fmt.Errorf("查询记录失败: %w", err) } if count == 0 { _, err = database.DB.Exec( `INSERT INTO kfz_token (login_name, username, password, token, is_enable) VALUES (?, ?, ?, ?, 1)`, loginName, username, password, token, ) } else { _, err = database.DB.Exec( `UPDATE kfz_token SET username = ?, password = ?, token = ?, is_enable = 1 WHERE login_name = ?`, username, password, token, loginName, ) } if err != nil { return fmt.Errorf("保存Token记录失败: %w", err) } log.Printf("[Repo/Token] 保存Token成功: login_name=%s, username=%s", loginName, username) return nil } // GetAll 查询所有记录 func (r *TokenRepository) GetAll() ([]*KfzToken, error) { query := `SELECT id, login_name, username, token, is_enable FROM kfz_token ORDER BY id ASC` rows, err := database.DB.Query(query) if err != nil { return nil, fmt.Errorf("查询失败: %w", err) } defer rows.Close() var records []*KfzToken for rows.Next() { var rec KfzToken err := rows.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Token, &rec.IsEnable) if err != nil { return nil, fmt.Errorf("扫描失败: %w", err) } records = append(records, &rec) } return records, nil } // GetByID 根据ID查询单条记录 func (r *TokenRepository) GetByID(id int64) (*KfzToken, error) { query := `SELECT id, login_name, username, password, token, is_enable FROM kfz_token WHERE id = ?` row := database.DB.QueryRow(query, id) var rec KfzToken err := row.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable) if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("记录不存在") } return nil, fmt.Errorf("查询失败: %w", err) } return &rec, nil } // GetByLoginName 根据登录名查询记录 func (r *TokenRepository) GetByLoginName(loginName string) (*KfzToken, error) { query := `SELECT id, login_name, username, password, token, is_enable FROM kfz_token WHERE login_name = ?` row := database.DB.QueryRow(query, loginName) var rec KfzToken err := row.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable) if err != nil { if err == sql.ErrNoRows { return nil, nil } return nil, fmt.Errorf("查询失败: %w", err) } return &rec, nil } // Update 更新记录 func (r *TokenRepository) Update(id int64, loginName, username, password, token string, isEnable bool) error { query := `UPDATE kfz_token SET login_name = ?, username = ?, password = ?, token = ?, is_enable = ? WHERE id = ?` result, err := database.DB.Exec(query, loginName, username, password, token, isEnable, id) if err != nil { return fmt.Errorf("更新失败: %w", err) } rowsAffected, _ := result.RowsAffected() if rowsAffected == 0 { return fmt.Errorf("记录不存在") } return nil } // UpdateToken 只更新token字段(用于自动重新登录) func (r *TokenRepository) UpdateToken(id int64, token string) error { query := `UPDATE kfz_token SET token = ? WHERE id = ?` result, err := database.DB.Exec(query, token, id) if err != nil { return fmt.Errorf("更新Token失败: %w", err) } rowsAffected, _ := result.RowsAffected() if rowsAffected == 0 { return fmt.Errorf("记录不存在") } log.Printf("[Repo/Token] 更新Token成功: id=%d", id) return nil } // Delete 删除记录 func (r *TokenRepository) Delete(id int64) error { query := `DELETE FROM kfz_token WHERE id = ?` result, err := database.DB.Exec(query, id) if err != nil { return fmt.Errorf("删除失败: %w", err) } rowsAffected, _ := result.RowsAffected() if rowsAffected == 0 { return fmt.Errorf("记录不存在") } return nil } // GetEnabledTokens 获取所有启用状态的Token func (r *TokenRepository) GetEnabledTokens() ([]*KfzToken, error) { query := `SELECT id, login_name, username, password, token, is_enable FROM kfz_token WHERE is_enable = 1 ORDER BY id ASC` rows, err := database.DB.Query(query) if err != nil { return nil, fmt.Errorf("查询失败: %w", err) } defer rows.Close() var records []*KfzToken for rows.Next() { var rec KfzToken err := rows.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable) if err != nil { return nil, fmt.Errorf("扫描失败: %w", err) } records = append(records, &rec) } return records, nil }