bindbox-game/internal/service/user/item_cards_list.go
邹方成 45815bfb7d chore: 清理无用文件与优化代码结构
refactor(utils): 修复密码哈希比较逻辑错误
feat(user): 新增按状态筛选优惠券接口
docs: 添加虚拟发货与任务中心相关文档
fix(wechat): 修正Code2Session上下文传递问题
test: 补充订单折扣与积分转换测试用例
build: 更新配置文件与构建脚本
style: 清理多余的空行与注释
2025-12-18 17:35:55 +08:00

261 lines
6.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"
)
type ItemCardWithTemplate struct {
*model.UserItemCards
Name string `json:"name"`
CardType int32 `json:"card_type"`
ScopeType int32 `json:"scope_type"`
EffectType int32 `json:"effect_type"`
StackingStrategy int32 `json:"stacking_strategy"`
Remark string `json:"remark"`
}
// ListUserItemCards 获取用户道具卡列表
// 功能描述:
// - 查询指定用户的道具卡列表
// - 支持分页查询默认每页20条最大100条
// - 按创建时间倒序排列
//
// 参数说明:
// - ctx: 上下文
// - userID: 用户ID
// - page: 页码从1开始小于1时自动设为1
// - pageSize: 每页条数小于1时设为20大于100时设为100
//
// 返回说明:
// - items: 道具卡列表
// - total: 总记录数
// - err: 错误信息
func (s *service) ListUserItemCards(ctx context.Context, userID int64, page, pageSize int) (items []*model.UserItemCards, total int64, err error) {
q := s.readDB.UserItemCards.WithContext(ctx).ReadDB().Where(s.readDB.UserItemCards.UserID.Eq(userID))
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.UserItemCards.ID.Desc()).Offset((page - 1) * pageSize).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
return items, total, nil
}
func (s *service) ListUserItemCardsWithTemplate(ctx context.Context, userID int64, page, pageSize int) (items []*ItemCardWithTemplate, total int64, err error) {
q := s.readDB.UserItemCards.WithContext(ctx).ReadDB().Where(s.readDB.UserItemCards.UserID.Eq(userID))
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
}
rows, err := q.Order(s.readDB.UserItemCards.ID.Desc()).Offset((page - 1) * pageSize).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
cidMap := make(map[int64]struct{})
for _, r := range rows {
if r.CardID > 0 {
cidMap[r.CardID] = struct{}{}
}
}
tpls := map[int64]*model.SystemItemCards{}
if len(cidMap) > 0 {
ids := make([]int64, 0, len(cidMap))
for id := range cidMap {
ids = append(ids, id)
}
list, err := s.readDB.SystemItemCards.WithContext(ctx).ReadDB().Where(s.readDB.SystemItemCards.ID.In(ids...)).Find()
if err != nil {
return nil, 0, err
}
for _, it := range list {
tpls[it.ID] = it
}
}
items = make([]*ItemCardWithTemplate, len(rows))
for i, r := range rows {
tpl := tpls[r.CardID]
var name string
var cardType, scopeType, effectType, stacking int32
var remark string
if tpl != nil {
name = tpl.Name
cardType = tpl.CardType
scopeType = tpl.ScopeType
effectType = tpl.EffectType
stacking = tpl.StackingStrategy
remark = tpl.Remark
}
items[i] = &ItemCardWithTemplate{
UserItemCards: r,
Name: name,
CardType: cardType,
ScopeType: scopeType,
EffectType: effectType,
StackingStrategy: stacking,
Remark: remark,
}
}
return items, total, nil
}
func (s *service) ListUserItemCardsWithTemplateUsable(ctx context.Context, userID int64, page, pageSize int) (items []*ItemCardWithTemplate, total int64, err error) {
q := s.readDB.UserItemCards.WithContext(ctx).ReadDB().Where(
s.readDB.UserItemCards.UserID.Eq(userID),
s.readDB.UserItemCards.Status.Eq(1),
)
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
}
rows, err := q.Order(s.readDB.UserItemCards.ID.Desc()).Offset((page - 1) * pageSize).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
cidMap := make(map[int64]struct{})
for _, r := range rows {
if r.CardID > 0 {
cidMap[r.CardID] = struct{}{}
}
}
tpls := map[int64]*model.SystemItemCards{}
if len(cidMap) > 0 {
ids := make([]int64, 0, len(cidMap))
for id := range cidMap {
ids = append(ids, id)
}
list, err := s.readDB.SystemItemCards.WithContext(ctx).ReadDB().Where(s.readDB.SystemItemCards.ID.In(ids...)).Find()
if err != nil {
return nil, 0, err
}
for _, it := range list {
tpls[it.ID] = it
}
}
items = make([]*ItemCardWithTemplate, len(rows))
for i, r := range rows {
tpl := tpls[r.CardID]
var name string
var cardType, scopeType, effectType, stacking int32
var remark string
if tpl != nil {
name = tpl.Name
cardType = tpl.CardType
scopeType = tpl.ScopeType
effectType = tpl.EffectType
stacking = tpl.StackingStrategy
remark = tpl.Remark
}
items[i] = &ItemCardWithTemplate{
UserItemCards: r,
Name: name,
CardType: cardType,
ScopeType: scopeType,
EffectType: effectType,
StackingStrategy: stacking,
Remark: remark,
}
}
return items, total, nil
}
// ListUserItemCardsWithTemplateByStatus 按状态获取用户道具卡列表
func (s *service) ListUserItemCardsWithTemplateByStatus(ctx context.Context, userID int64, status int32, page, pageSize int) (items []*ItemCardWithTemplate, total int64, err error) {
q := s.readDB.UserItemCards.WithContext(ctx).ReadDB().Where(
s.readDB.UserItemCards.UserID.Eq(userID),
s.readDB.UserItemCards.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
}
rows, err := q.Order(s.readDB.UserItemCards.ID.Desc()).Offset((page - 1) * pageSize).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
cidMap := make(map[int64]struct{})
for _, r := range rows {
if r.CardID > 0 {
cidMap[r.CardID] = struct{}{}
}
}
tpls := map[int64]*model.SystemItemCards{}
if len(cidMap) > 0 {
ids := make([]int64, 0, len(cidMap))
for id := range cidMap {
ids = append(ids, id)
}
list, err := s.readDB.SystemItemCards.WithContext(ctx).ReadDB().Where(s.readDB.SystemItemCards.ID.In(ids...)).Find()
if err != nil {
return nil, 0, err
}
for _, it := range list {
tpls[it.ID] = it
}
}
items = make([]*ItemCardWithTemplate, len(rows))
for i, r := range rows {
tpl := tpls[r.CardID]
var name string
var cardType, scopeType, effectType, stacking int32
var remark string
if tpl != nil {
name = tpl.Name
cardType = tpl.CardType
scopeType = tpl.ScopeType
effectType = tpl.EffectType
stacking = tpl.StackingStrategy
remark = tpl.Remark
}
items[i] = &ItemCardWithTemplate{
UserItemCards: r,
Name: name,
CardType: cardType,
ScopeType: scopeType,
EffectType: effectType,
StackingStrategy: stacking,
Remark: remark,
}
}
return items, total, nil
}