package services import ( "errors" "fmt" "platform/web/core" m "platform/web/models" q "platform/web/queries" "time" "github.com/shopspring/decimal" "gorm.io/gorm" ) var Coupon = &couponService{} type couponService struct{} func (s *couponService) GetCouponAvailableByCode(code string, amount decimal.Decimal, uid *int32) (*m.Coupon, error) { // 获取优惠券 coupon, err := q.Coupon.Where( q.Coupon.Code.Eq(code), q.Coupon.Status.Eq(int(m.CouponStatusUnused)), q.Coupon. Where(q.Coupon.ExpireAt.Gt(time.Now())). Or(q.Coupon.ExpireAt.IsNull()), ).Take() if errors.Is(err, gorm.ErrRecordNotFound) { return nil, core.NewBizErr("优惠券不存在或已失效") } if err != nil { return nil, core.NewBizErr("获取优惠券数据失败", err) } // 检查最小使用额度 if amount.Cmp(coupon.MinAmount) < 0 { return nil, core.NewBizErr(fmt.Sprintf("使用此优惠券的最小额度为 %s", coupon.MinAmount)) } // 检查所属 if coupon.UserID != nil { if uid == nil { return nil, core.NewBizErr("检查优惠券所属用户失败") } if *coupon.UserID != *uid { return nil, core.NewBizErr("优惠券不属于当前用户") } } return coupon, nil } func (s *couponService) UseCoupon(q *q.Query, id int32) error { _, err := q.Coupon. Where( q.Coupon.ID.Eq(id), q.Coupon.Status.Eq(int(m.CouponStatusUnused)), q.Coupon.ExpireAt.Gt(time.Now()), ). UpdateSimple( q.Coupon.Status.Value(int(m.CouponStatusUsed)), ) return err }