Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(抽奖动态): 修复抽奖动态未渲染问题并优化文案展示 fix(用户概览): 修复用户概览无数据显示问题 feat(新用户列表): 在新用户列表显示称号明细 refactor(待办事项): 移除代办模块并全宽展示实时动态 feat(批量操作): 限制为单用户操作并在批量时提醒 fix(称号分配): 防重复分配称号的改造计划 perf(接口性能): 优化新用户和抽奖动态接口性能 feat(订单漏斗): 优化订单转化漏斗指标计算 docs(测试计划): 完善盲盒运营API核查与闭环测试计划
73 lines
2.4 KiB
Go
73 lines
2.4 KiB
Go
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
|
||
}
|
||
|