Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat(pay): 添加支付API基础结构 feat(miniapp): 创建支付测试小程序页面与配置 feat(wechatpay): 配置微信支付参数与证书 fix(guild): 修复成员列表查询条件 docs: 更新代码规范文档与需求文档 style: 统一前后端枚举显示与注释格式 refactor(admin): 重构用户奖励发放接口参数处理 test(title): 添加称号效果参数验证测试
80 lines
3.1 KiB
Go
80 lines
3.1 KiB
Go
package activity
|
|
|
|
import (
|
|
"context"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
|
|
"bindbox-game/internal/repository/mysql/dao"
|
|
"bindbox-game/internal/repository/mysql/model"
|
|
)
|
|
|
|
// BatchDrawForUsers 批量为用户执行抽奖并写入日志与收据
|
|
// 参数: issueID 期ID, userIDs 用户ID数组
|
|
// 返回: 抽奖结果集合与错误
|
|
func (s *service) BatchDrawForUsers(ctx context.Context, issueID int64, userIDs []int64) ([]BatchDrawItem, error) {
|
|
rewards, err := s.readDB.ActivityRewardSettings.WithContext(ctx).
|
|
Where(s.readDB.ActivityRewardSettings.IssueID.Eq(issueID)).
|
|
Order(s.readDB.ActivityRewardSettings.Sort).
|
|
Find()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
rewardMap := make(map[int64]string, len(rewards))
|
|
for _, r := range rewards { rewardMap[r.ID] = r.Name }
|
|
|
|
draws := make([]BatchDrawItem, 0, len(userIDs))
|
|
err = s.writeDB.Transaction(func(tx *dao.Query) error {
|
|
for _, uid := range userIDs {
|
|
rec, err := s.ExecuteDrawWithEffects(ctx, issueID, uid)
|
|
if err != nil { return err }
|
|
|
|
isWinner := int32(0)
|
|
if rec.SelectedItemId > 0 { isWinner = 1 }
|
|
|
|
drawLog := &model.ActivityDrawLogs{
|
|
UserID: uid,
|
|
IssueID: issueID,
|
|
RewardID: rec.SelectedItemId,
|
|
IsWinner: isWinner,
|
|
Level: 1,
|
|
}
|
|
if err := tx.ActivityDrawLogs.WithContext(ctx).Create(drawLog); err != nil { return err }
|
|
|
|
itemsSnapshot, _ := json.Marshal(rec.Items)
|
|
receipt := &model.ActivityDrawReceipts{
|
|
DrawLogID: drawLog.ID,
|
|
AlgoVersion: rec.AlgoVersion,
|
|
RoundID: rec.RoundId,
|
|
DrawID: rec.DrawId,
|
|
ClientID: rec.ClientId,
|
|
Timestamp: rec.Timestamp,
|
|
ServerSeedHash: hex.EncodeToString(rec.ServerSeedHash),
|
|
ServerSubSeed: hex.EncodeToString(rec.ServerSubSeed),
|
|
ClientSeed: hex.EncodeToString(rec.ClientSeed),
|
|
Nonce: int64(rec.Nonce),
|
|
ItemsRoot: hex.EncodeToString(rec.ItemsRoot),
|
|
WeightsTotal: int64(rec.WeightsTotal),
|
|
SelectedIndex: int32(rec.SelectedIndex),
|
|
RandProof: hex.EncodeToString(rec.RandProof),
|
|
Signature: "",
|
|
ItemsSnapshot: string(itemsSnapshot),
|
|
}
|
|
if err := tx.ActivityDrawReceipts.WithContext(ctx).Create(receipt); err != nil { return err }
|
|
|
|
name := ""
|
|
if rec.SelectedItemId > 0 { name = rewardMap[rec.SelectedItemId] }
|
|
draws = append(draws, BatchDrawItem{
|
|
UserID: uid,
|
|
DrawID: rec.DrawId,
|
|
RewardID: rec.SelectedItemId,
|
|
RewardName: name,
|
|
IsWinner: rec.SelectedItemId > 0,
|
|
Receipt: rec,
|
|
})
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil { return nil, err }
|
|
return draws, nil
|
|
} |