bindbox-game/internal/service/user/item_card_add.go
邹方成 87ad4177b1
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(工作台): 实现管理端工作台接口并优化数据展示
feat(抽奖动态): 修复抽奖动态未渲染问题并优化文案展示
fix(用户概览): 修复用户概览无数据显示问题
feat(新用户列表): 在新用户列表显示称号明细
refactor(待办事项): 移除代办模块并全宽展示实时动态
feat(批量操作): 限制为单用户操作并在批量时提醒
fix(称号分配): 防重复分配称号的改造计划
perf(接口性能): 优化新用户和抽奖动态接口性能
feat(订单漏斗): 优化订单转化漏斗指标计算
docs(测试计划): 完善盲盒运营API核查与闭环测试计划
2025-11-16 14:00:29 +08:00

73 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"
"time"
"bindbox-game/internal/repository/mysql/model"
"gorm.io/gorm"
)
// AddItemCard 给用户添加道具卡
// 功能描述:
// - 根据道具卡模板ID查询模板信息
// - 验证道具卡状态是否有效status=1
// - 创建用户道具卡记录,继承模板的有效期设置
// - 支持批量添加quantity参数控制数量
//
// 参数说明:
// - ctx: 上下文
// - userID: 用户ID
// - cardID: 道具卡模板ID
// - quantity: 添加数量,如果<=0则默认为1
//
// 返回说明:
// - error: 错误信息,包括数据库查询失败、模板不存在等情况
func (s *service) AddItemCard(ctx context.Context, userID int64, cardID int64, quantity int) error {
if quantity <= 0 { quantity = 1 }
if quantity > 100 { quantity = 100 }
tpl, err := s.readDB.SystemItemCards.WithContext(ctx).Where(s.readDB.SystemItemCards.ID.Eq(cardID)).First()
if err != nil {
return err
}
if tpl == nil || tpl.Status != 1 {
return nil
}
// 用户持有上限同模板未使用数量最多10张
exist, eerr := s.readDB.UserItemCards.WithContext(ctx).
Where(s.readDB.UserItemCards.UserID.Eq(userID)).
Where(s.readDB.UserItemCards.CardID.Eq(cardID)).
Where(s.readDB.UserItemCards.Status.Eq(1)).
Count()
if eerr != nil { return eerr }
if exist >= 10 { return gorm.ErrInvalidData }
now := time.Now()
for i := 0; i < quantity; i++ {
item := &model.UserItemCards{UserID: userID, CardID: cardID, Status: 1}
if !tpl.ValidStart.IsZero() {
item.ValidStart = tpl.ValidStart
} else {
item.ValidStart = now
}
if !tpl.ValidEnd.IsZero() {
item.ValidEnd = tpl.ValidEnd
}
do := s.writeDB.UserItemCards.WithContext(ctx)
// 避免写入未使用相关字段的零值,触发 MySQL 时间字段校验错误
do = do.Omit(
s.writeDB.UserItemCards.UsedAt,
s.writeDB.UserItemCards.UsedDrawLogID,
s.writeDB.UserItemCards.UsedActivityID,
s.writeDB.UserItemCards.UsedIssueID,
)
if tpl.ValidEnd.IsZero() {
do = do.Omit(s.writeDB.UserItemCards.ValidEnd)
}
if err := do.Create(item); err != nil {
return err
}
}
return nil
}