bindbox-game/internal/service/user/coupons_list.go

80 lines
2.4 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端查看优惠券
// status=1 有效(未使用+使用中) status=2 已失效(用完+已使用+已过期)
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
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(tableName+".status = ? AND "+tableName+".balance_amount > ?", 1, 0)
case 2: // 已失效:余额用完(status=1且balance=0) 或 已使用(status=2) 或 已过期(status=3)
db = db.Where("("+tableName+".status = ? AND "+tableName+".balance_amount = ?) OR "+tableName+".status IN (?,?)", 1, 0, 2, 3)
default:
db = db.Where(tableName+".status = ? AND "+tableName+".balance_amount > ?", 1, 0)
}
if err = db.Count(&total).Error; err != nil {
return nil, 0, err
}
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 20
}
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
}