Initial commit
This commit is contained in:
123
server/internal/repository/coupon.go
Normal file
123
server/internal/repository/coupon.go
Normal file
@@ -0,0 +1,123 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"dianshang/internal/model"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// CouponRepository 优惠券仓储
|
||||
type CouponRepository struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewCouponRepository 创建优惠券仓储
|
||||
func NewCouponRepository(db *gorm.DB) *CouponRepository {
|
||||
return &CouponRepository{db: db}
|
||||
}
|
||||
|
||||
// GetAvailableCoupons 获取可用优惠券列表
|
||||
func (r *CouponRepository) GetAvailableCoupons() ([]model.Coupon, error) {
|
||||
var coupons []model.Coupon
|
||||
now := time.Now()
|
||||
err := r.db.Where("status = ? AND start_time <= ? AND end_time >= ?", 1, now, now).
|
||||
Where("total_count = 0 OR used_count < total_count").
|
||||
Order("created_at DESC").
|
||||
Find(&coupons).Error
|
||||
return coupons, err
|
||||
}
|
||||
|
||||
// GetUserCoupons 获取用户优惠券
|
||||
func (r *CouponRepository) GetUserCoupons(userID uint, status int) ([]model.UserCoupon, error) {
|
||||
var userCoupons []model.UserCoupon
|
||||
query := r.db.Preload("Coupon").Where("user_id = ?", userID)
|
||||
|
||||
if status > 0 {
|
||||
// API状态值到数据库状态值的映射
|
||||
// API: 1=未使用,2=已使用,3=已过期
|
||||
// DB: 0=未使用,1=已使用,2=已过期
|
||||
dbStatus := status - 1
|
||||
query = query.Where("status = ?", dbStatus)
|
||||
}
|
||||
|
||||
err := query.Order("created_at DESC").Find(&userCoupons).Error
|
||||
return userCoupons, err
|
||||
}
|
||||
|
||||
// GetByID 根据ID获取优惠券
|
||||
func (r *CouponRepository) GetByID(id uint) (*model.Coupon, error) {
|
||||
var coupon model.Coupon
|
||||
err := r.db.First(&coupon, id).Error
|
||||
return &coupon, err
|
||||
}
|
||||
|
||||
// CheckUserCouponExists 检查用户是否已领取优惠券
|
||||
func (r *CouponRepository) CheckUserCouponExists(userID, couponID uint) (bool, error) {
|
||||
var count int64
|
||||
err := r.db.Model(&model.UserCoupon{}).
|
||||
Where("user_id = ? AND coupon_id = ?", userID, couponID).
|
||||
Count(&count).Error
|
||||
return count > 0, err
|
||||
}
|
||||
|
||||
// GetUserCouponCount 获取用户领取某优惠券的数量
|
||||
func (r *CouponRepository) GetUserCouponCount(userID, couponID uint) (int, error) {
|
||||
var count int64
|
||||
err := r.db.Model(&model.UserCoupon{}).
|
||||
Where("user_id = ? AND coupon_id = ?", userID, couponID).
|
||||
Count(&count).Error
|
||||
return int(count), err
|
||||
}
|
||||
|
||||
// CreateUserCoupon 创建用户优惠券记录
|
||||
func (r *CouponRepository) CreateUserCoupon(userCoupon *model.UserCoupon) error {
|
||||
return r.db.Transaction(func(tx *gorm.DB) error {
|
||||
// 创建用户优惠券记录
|
||||
if err := tx.Create(userCoupon).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 更新优惠券使用数量
|
||||
return tx.Model(&model.Coupon{}).
|
||||
Where("id = ?", userCoupon.CouponID).
|
||||
UpdateColumn("used_count", gorm.Expr("used_count + ?", 1)).Error
|
||||
})
|
||||
}
|
||||
|
||||
// GetUserCouponByID 根据ID获取用户优惠券
|
||||
func (r *CouponRepository) GetUserCouponByID(id uint) (*model.UserCoupon, error) {
|
||||
var userCoupon model.UserCoupon
|
||||
err := r.db.Preload("Coupon").First(&userCoupon, id).Error
|
||||
return &userCoupon, err
|
||||
}
|
||||
|
||||
// GetUserCouponByOrderID 根据订单ID获取用户优惠券
|
||||
func (r *CouponRepository) GetUserCouponByOrderID(orderID uint) (*model.UserCoupon, error) {
|
||||
var userCoupon model.UserCoupon
|
||||
err := r.db.Preload("Coupon").Where("order_id = ?", orderID).First(&userCoupon).Error
|
||||
return &userCoupon, err
|
||||
}
|
||||
|
||||
// UseCoupon 使用优惠券
|
||||
func (r *CouponRepository) UseCoupon(userCouponID, orderID uint) error {
|
||||
now := time.Now()
|
||||
return r.db.Model(&model.UserCoupon{}).
|
||||
Where("id = ?", userCouponID).
|
||||
Updates(map[string]interface{}{
|
||||
"status": 1, // 已使用
|
||||
"order_id": orderID,
|
||||
"used_time": &now,
|
||||
}).Error
|
||||
}
|
||||
|
||||
// RestoreCoupon 恢复优惠券(取消订单时使用)
|
||||
func (r *CouponRepository) RestoreCoupon(userCouponID uint) error {
|
||||
return r.db.Model(&model.UserCoupon{}).
|
||||
Where("id = ?", userCouponID).
|
||||
Updates(map[string]interface{}{
|
||||
"status": 0, // 恢复为未使用
|
||||
"order_id": nil, // 清除订单关联
|
||||
"used_time": nil, // 清除使用时间
|
||||
}).Error
|
||||
}
|
||||
Reference in New Issue
Block a user