邹方成 e2782a69d3 feat: 添加对对碰游戏功能与Redis支持
refactor: 重构抽奖逻辑以支持可验证凭据
feat(redis): 集成Redis客户端并添加配置支持
fix: 修复订单取消时的优惠券和库存处理逻辑
docs: 添加对对碰游戏前端对接指南和示例JSON
test: 添加对对碰游戏模拟测试和验证逻辑
2025-12-21 17:31:32 +08:00

232 lines
6.3 KiB
Go

package activity
import (
"context"
"time"
"bindbox-game/internal/pkg/logger"
"bindbox-game/internal/repository/mysql"
"bindbox-game/internal/repository/mysql/dao"
"bindbox-game/internal/repository/mysql/model"
)
type Service interface {
// CreateActivity 创建活动
// 参数: in 活动创建输入
// 返回: 活动记录与错误
CreateActivity(ctx context.Context, in CreateActivityInput) (*model.Activities, error)
// ModifyActivity 修改活动
// 参数: id 活动ID, in 修改输入
// 返回: 错误信息
ModifyActivity(ctx context.Context, id int64, in ModifyActivityInput) error
// DeleteActivity 删除活动
// 参数: id 活动ID
// 返回: 错误信息
DeleteActivity(ctx context.Context, id int64) error
// GetActivity 获取活动详情
// 参数: id 活动ID
// 返回: 活动记录与错误
GetActivity(ctx context.Context, id int64) (*model.Activities, error)
// ListActivities 活动列表
// 参数: in 列表查询输入
// 返回: 活动集合、总数与错误
ListActivities(ctx context.Context, in ListActivitiesInput) (items []*model.Activities, total int64, err error)
// ListIssues 活动期列表
// 参数: activityID 活动ID, page 页码, pageSize 每页数量
// 返回: 期列表、总数与错误
ListIssues(ctx context.Context, activityID int64, page, pageSize int) (items []*model.ActivityIssues, total int64, err error)
// CreateIssue 创建期
// 参数: activityID 活动ID, in 创建输入
// 返回: 期记录与错误
CreateIssue(ctx context.Context, activityID int64, in CreateIssueInput) (*model.ActivityIssues, error)
// ModifyIssue 修改期
// 参数: issueID 期ID, in 修改输入
// 返回: 错误信息
ModifyIssue(ctx context.Context, issueID int64, in ModifyIssueInput) error
// DeleteIssue 删除期
// 参数: issueID 期ID
// 返回: 错误信息
DeleteIssue(ctx context.Context, issueID int64) error
// CreateIssueRewards 批量创建期奖励
// 参数: issueID 期ID, rewards 奖励创建输入数组
// 返回: 错误信息
CreateIssueRewards(ctx context.Context, issueID int64, rewards []CreateRewardInput) error
// ListIssueRewards 查询期奖励列表
// 参数: issueID 期ID
// 返回: 奖励集合与错误
ListIssueRewards(ctx context.Context, issueID int64) (items []*model.ActivityRewardSettings, err error)
// ModifyIssueReward 修改单个奖励
// 参数: rewardID 奖励ID, in 修改输入
// 返回: 错误信息
ModifyIssueReward(ctx context.Context, rewardID int64, in ModifyRewardInput) error
// DeleteIssueReward 删除单个奖励
// 参数: rewardID 奖励ID
// 返回: 错误信息
DeleteIssueReward(ctx context.Context, rewardID int64) error
// ListDrawLogs 抽奖记录列表
// 参数: issueID 期ID, page/pageSize 分页
// 返回: 抽奖记录集合、总数与错误
ListDrawLogs(ctx context.Context, issueID int64, page, pageSize int) (items []*model.ActivityDrawLogs, total int64, err error)
// GetCategoryNames 批量查询分类名称
// 参数: ids 分类ID数组
// 返回: id->名称映射与错误
GetCategoryNames(ctx context.Context, ids []int64) (map[int64]string, error)
// CopyActivity 复制活动及其期次与奖励
// 参数: activityID 源活动ID
// 返回: 新活动ID与错误
CopyActivity(ctx context.Context, activityID int64) (int64, error)
// SaveActivityDrawConfig 保存活动开奖配置
// 参数: activityID 活动ID, cfg 配置
// 返回: 错误信息
SaveActivityDrawConfig(ctx context.Context, activityID int64, cfg DrawConfig) error
// GetActivityDrawConfig 读取活动开奖配置
// 参数: activityID 活动ID
// 返回: 配置与错误
GetActivityDrawConfig(ctx context.Context, activityID int64) (*DrawConfig, error)
}
type service struct {
logger logger.CustomLogger
readDB *dao.Query
writeDB *dao.Query
repo mysql.Repo
}
func New(l logger.CustomLogger, db mysql.Repo) Service {
return &service{
logger: l,
readDB: dao.Use(db.GetDbR()),
writeDB: dao.Use(db.GetDbW()),
repo: db,
}
}
type CreateActivityInput struct {
// Name 活动名称
Name string
// Banner 活动头图
Banner string
// Image 活动主图
Image string
// GameplayIntro 玩法介绍
GameplayIntro string
// ActivityCategoryID 活动分类ID
ActivityCategoryID int64
// Status 活动状态
Status int32
// PriceDraw 单次抽奖价格(分)
PriceDraw int64
// IsBoss 是否Boss活动
IsBoss int32
// StartTime 活动开始时间(可选)
StartTime *time.Time
// EndTime 活动结束时间(可选)
EndTime *time.Time
AllowItemCards int32
AllowCoupons int32
}
type ModifyActivityInput struct {
// Name 活动名称
Name string
// Banner 活动头图
Banner string
// Image 活动主图
Image string
// GameplayIntro 玩法介绍
GameplayIntro string
// ActivityCategoryID 活动分类ID
ActivityCategoryID int64
// Status 活动状态
Status int32
// PriceDraw 单次抽奖价格(分)
PriceDraw int64
// IsBoss 是否Boss活动
IsBoss int32
// StartTime 活动开始时间(可选)
StartTime *time.Time
// EndTime 活动结束时间(可选)
EndTime *time.Time
AllowItemCards *int32
AllowCoupons *int32
}
type ListActivitiesInput struct {
// Name 名称过滤
Name string
// CategoryID 分类过滤
CategoryID int64
// IsBoss Boss过滤
IsBoss *int32
// Status 状态过滤
Status *int32
// Page 页码
Page int
// PageSize 每页数量
PageSize int
}
type CreateIssueInput struct {
// IssueNumber 期号
IssueNumber string
// Status 状态
Status int32
// Sort 排序
Sort int32
}
type ModifyIssueInput struct {
// IssueNumber 期号
IssueNumber string
// Status 状态
Status int32
// Sort 排序
Sort int32
}
type CreateRewardInput struct {
// ProductID 商品ID
ProductID int64
// Name 奖励名称
Name string
// Weight 权重
Weight int32
// Quantity 数量(-1 表示不限)
Quantity int64
// OriginalQty 初始数量
OriginalQty int64
// Level 奖励等级
Level int32
// Sort 排序
Sort int32
// IsBoss 是否Boss奖励
IsBoss int32
MinScore int64
}
type ModifyRewardInput struct {
// ProductID 商品ID
ProductID *int64
// Name 奖励名称
Name string
// Weight 权重
Weight *int32
// Quantity 数量(-1 表示不限)
Quantity *int64
// OriginalQty 初始数量
OriginalQty *int64
// Level 奖励等级
Level *int32
// Sort 排序
Sort *int32
// IsBoss 是否Boss奖励
IsBoss *int32
MinScore *int64
}