bindbox-game/internal/service/user/coupons_list.go
2026-02-18 23:23:34 +08:00

87 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package user
import (
"context"
"bindbox-game/internal/repository/mysql/model"
)
func (s *service) ListCoupons(ctx context.Context, userID int64, page, pageSize int) (items []*model.UserCoupons, total int64, err error) {
return s.ListCouponsByStatus(ctx, userID, 1, page, pageSize)
}
// ListCouponsByStatus 按状态获取用户优惠券列表
func (s *service) ListCouponsByStatus(ctx context.Context, userID int64, status int32, page, pageSize int) (items []*model.UserCoupons, total int64, err error) {
q := s.readDB.UserCoupons.WithContext(ctx).ReadDB().Where(
s.readDB.UserCoupons.UserID.Eq(userID),
s.readDB.UserCoupons.Status.Eq(status),
)
total, err = q.Count()
if err != nil {
return nil, 0, err
}
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 20
}
if pageSize > 100 {
pageSize = 100
}
items, err = q.Order(s.readDB.UserCoupons.ID.Desc()).Offset((page - 1) * pageSize).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
return items, total, nil
}
// ListAppCoupons APP端查看优惠券分类逻辑优化未使用=未动过,已使用=部分使用or已用完
// ListAppCoupons APP端查看优惠券分类逻辑优化未使用=未动过,已使用=部分使用or已用完
func (s *service) ListAppCoupons(ctx context.Context, userID int64, status int32, page, pageSize int) (items []*model.UserCoupons, total int64, err error) {
u := s.readDB.UserCoupons
c := s.readDB.SystemCoupons
// 使用 UnderlyingDB 绕过 GEN 的类型限制,确保 SQL 逻辑正确
tableName := u.TableName()
sysTableName := c.TableName()
db := u.UnderlyingDB().WithContext(ctx).
Table(tableName).
Select("`"+tableName+"`.*").
Joins("LEFT JOIN `"+sysTableName+"` ON `"+sysTableName+"`.id = `"+tableName+"`.coupon_id").
Where("`"+tableName+"`.user_id = ?", userID)
// 过滤逻辑
switch status {
case 1: // 未使用 (Status=1且余额>0)
db = db.Where(u.TableName()+".status = ? AND "+u.TableName()+".balance_amount > ?", 1, 0)
case 2: // 已使用 (Status=2 或 Status=1且余额=0)
// Condition: (Status=1 AND Balance = 0) OR Status=2
db = db.Where("("+u.TableName()+".status = ? AND "+u.TableName()+".balance_amount = ?) OR "+u.TableName()+".status = ?", 1, 0, 2)
case 3: // 已过期
db = db.Where(u.TableName()+".status = ?", 3)
default: // 默认只查未使用 (fallback to 1 logic)
db = db.Where(u.TableName()+".status = ? AND "+u.TableName()+".balance_amount > ?", 1, 0)
}
// Count
if err = db.Count(&total).Error; err != nil {
return nil, 0, err
}
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 20
}
// Find
err = db.Order("`" + tableName + "`.id DESC").Offset((page - 1) * pageSize).Limit(pageSize).Scan(&items).Error
if err != nil {
return nil, 0, err
}
return items, total, nil
}