# 修复一番赏策略库存扣减竞态问题

经检查，`internal/service/activity/strategy/ichiban.go` 中的 `GrantReward` 方法存在严重的竞态条件风险。当前实现采用“先查询库存，再更新库存”的方式，在高并发下可能导致超卖。

## 修复计划

我将参照 `default.go` 和 `reward_grant.go` 中的正确实现，对 `ichiban.go` 进行以下修改：

1.  **重构 `GrantReward` 方法**
    *   移除原有的 `First()` 查询逻辑。
    *   改为使用**乐观锁**原子更新：
        *   查询条件增加 `Quantity > 0`。
        *   使用 `UpdateSimple` 执行 `Quantity - 1`。
    *   根据 `RowsAffected` 判断扣减是否成功。

## 预期代码变更

```go
func (s *ichibanStrategy) GrantReward(ctx context.Context, userID int64, rewardID int64) error {
    // 使用乐观锁原子扣减库存
    result, err := s.write.ActivityRewardSettings.WithContext(ctx).Where(
        s.write.ActivityRewardSettings.ID.Eq(rewardID),
        s.write.ActivityRewardSettings.Quantity.Gt(0),
    ).UpdateSimple(s.write.ActivityRewardSettings.Quantity.Add(-1))
    
    if err != nil {
        return err
    }
    if result.RowsAffected == 0 {
        return errors.New("sold out or reward not found")
    }
    return nil
}
```

此修改将彻底解决库存扣减的并发安全问题。
