# v1.3.0 - 优惠券与促销系统

## 优惠券模型

```sql
CREATE TABLE coupons (
    id VARCHAR(32) PRIMARY KEY,  -- PROMO2024
    type ENUM('percentage', 'fixed') NOT NULL,
    value DECIMAL(10,2) NOT NULL,  -- 20% 或 $10
    min_amount DECIMAL(10,2) DEFAULT 0,
    max_uses INT DEFAULT 1,
    used_count INT DEFAULT 0,
    valid_from TIMESTAMP,
    valid_until TIMESTAMP,
    applicable_plans JSON,  -- ["basic", "premium"]
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

## 应用优惠券

```go
func (s *SubscriptionManager) ApplyCoupon(ctx context.Context, userID int64, couponCode string, planID int) (float64, error) {
    coupon, err := s.dao.GetCoupon(ctx, couponCode)
    if err != nil {
        return 0, errors.New("invalid coupon")
    }
    
    // 验证有效期
    if time.Now().Before(coupon.ValidFrom) || time.Now().After(coupon.ValidUntil) {
        return 0, errors.New("coupon expired")
    }
    
    // 验证使用次数
    if coupon.MaxUses > 0 && coupon.UsedCount >= coupon.MaxUses {
        return 0, errors.New("coupon exhausted")
    }
    
    // 计算折扣
    plan := s.getPlan(planID)
    var discount float64
    if coupon.Type == "percentage" {
        discount = plan.Price * coupon.Value / 100
    } else {
        discount = coupon.Value
    }
    
    // 记录使用
    s.dao.IncrementCouponUsage(ctx, couponCode)
    
    return plan.Price - discount, nil
}
```
