fix: 修复兑换码搜索中已使用兑换码搜索不到的问题

将 SearchRedemptions 的 Count 和 Find 拆成独立查询链,
避免 GORM 事务中共用 query 对象导致 Count() 污染查询状态。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-09 17:19:13 +08:00
parent 0bfb5a5ec0
commit 656ac88fa1

View File

@@ -74,25 +74,26 @@ func SearchRedemptions(keyword string, startIdx int, num int) (redemptions []*Re
}
}()
// Build query based on keyword type
query := tx.Model(&Redemption{})
// Only try to convert to ID if the string represents a valid integer
// Build WHERE condition and args based on keyword type
var whereClause string
var whereArgs []interface{}
if id, err := strconv.Atoi(keyword); err == nil {
query = query.Where("id = ? OR name LIKE ? OR "+commonKeyCol+" LIKE ?", id, keyword+"%", keyword+"%")
whereClause = "id = ? OR name LIKE ? OR " + commonKeyCol + " LIKE ?"
whereArgs = []interface{}{id, keyword + "%", keyword + "%"}
} else {
query = query.Where("name LIKE ? OR "+commonKeyCol+" LIKE ?", keyword+"%", keyword+"%")
whereClause = "name LIKE ? OR " + commonKeyCol + " LIKE ?"
whereArgs = []interface{}{keyword + "%", keyword + "%"}
}
// Get total count
err = query.Count(&total).Error
err = tx.Model(&Redemption{}).Where(whereClause, whereArgs...).Count(&total).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
// Get paginated data
err = query.Order("id desc").Limit(num).Offset(startIdx).Find(&redemptions).Error
err = tx.Model(&Redemption{}).Where(whereClause, whereArgs...).Order("id desc").Limit(num).Offset(startIdx).Find(&redemptions).Error
if err != nil {
tx.Rollback()
return nil, 0, err