Files
huangguo_server/app/service/luckydrawser/lucky_draw.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

207 lines
5.3 KiB
Go

package luckydrawser
import (
"context"
"errors"
"fmt"
"time"
"91porn-server/common/timeutil"
"91porn-server/models/v/activitymod"
"91porn-server/models/v/prizemod"
"91porn-server/models/v/txnmod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/walletmod"
"github.com/shopspring/decimal"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
func BaseInfo(ctx context.Context, in *BaseInfoReq) (out *BaseInfoResp, err error) {
now := time.Now()
wal, err := walletmod.GetWallet(in.UserId)
if err != nil {
return
}
id, err := primitive.ObjectIDFromHex(in.ActivityId)
if err != nil {
return nil, err
}
// 获取活动
activityInfo, err := activitymod.Get(id)
if err != nil {
return nil, err
}
if activityInfo == nil {
return nil, errors.New("活动不存在")
}
if !activityInfo.Status {
return nil, errors.New("活动未开启")
}
// 活动时间判定
if !now.After(activityInfo.StartTime) || now.After(activityInfo.EndTime) {
return nil, errors.New("活动已结束")
}
// 获取奖池配置
prizePoolInfo, err := activitymod.GetPrizePool(id)
if err != nil {
return nil, err
}
if prizePoolInfo == nil {
return nil, errors.New("奖池配置为空")
}
var freeCount int32
if prizePoolInfo.FreeCount > 0 {
// 获取用户免费记录
userFree, err := activitymod.GetUserFree(id, in.UserId)
if err != nil {
return nil, err
}
if userFree == nil {
if err = activitymod.AddUserFree(id, in.UserId, prizePoolInfo.FreeCount); err != nil {
return nil, err
}
freeCount = prizePoolInfo.FreeCount
} else {
// 今日已使用
if userFree.UpdateTime.After(timeutil.BeginningOfDay(time.Now())) {
freeCount = userFree.FreeCount
} else {
// 刷新免费次数
if err = activitymod.UpdateOneSet(id, in.UserId, prizePoolInfo.FreeCount); err != nil {
return nil, err
}
freeCount = prizePoolInfo.FreeCount
}
}
}
// 获取奖品列表
prizeList, err := prizemod.GetPrizeListByActivityID(id)
if err != nil {
return nil, err
}
if len(prizeList) == 0 {
return nil, errors.New("奖品配置为空")
}
// 获取用户当日抽奖消费金额
consumerAmount, _, err := txnmod.GetIncomeByType(in.UserId, txnmod.JiuGongGeDraw, timeutil.BeginningOfDay(now), timeutil.BeginningOfDay(now.AddDate(0, 0, 1)))
out = &BaseInfoResp{
Balance: wal.Amount,
FreeCount: freeCount,
Price: prizePoolInfo.Price,
Prizes: prizeList,
ConsumerAmount: -int64(consumerAmount),
ActivityTitle: activityInfo.Title,
ActivityDesc: activityInfo.Desc,
ActivityDate: activityInfo.StartTime.Format("2006-01-02") + "到" + activityInfo.EndTime.Format("2006-01-02"),
}
return
}
func Draw(ctx context.Context, in *DrawReq) ([]*prizemod.Prize, error) {
id, err := primitive.ObjectIDFromHex(in.ActivityId)
if err != nil {
return nil, err
}
// 获取活动
activityInfo, err := activitymod.Get(id)
if err != nil {
return nil, err
}
if activityInfo == nil {
return nil, errors.New("活动不存在")
} else {
if !activityInfo.Status {
return nil, errors.New("活动未开启")
}
// 活动时间判定
now := time.Now()
if !now.After(activityInfo.StartTime) || now.After(activityInfo.EndTime) {
return nil, errors.New("活动已结束")
}
}
// 获取奖品列表
prizeList, err := prizemod.GetPrizeListByActivityID(id)
if err != nil {
return nil, err
}
if len(prizeList) == 0 {
return nil, errors.New("奖品配置为空")
}
// 获取奖池配置
prizePoolInfo, err := activitymod.GetPrizePool(id)
if err != nil {
return nil, err
}
if prizePoolInfo == nil {
return nil, errors.New("奖池配置为空")
}
// 奖池模式处理
switch prizePoolInfo.Model {
case activitymod.Game:
case activitymod.Free:
return freeModelHanlder(in, id, prizeList, prizePoolInfo)
}
return nil, nil
}
// 个人抽奖记录
func Record(ctx context.Context, activityId string, uid uint64) (interface{}, error) {
id, err := primitive.ObjectIDFromHex(activityId)
if err != nil {
return nil, err
}
list, err := activitymod.QueryAllRecord(bson.M{"activityId": id, "uid": uid}, options.Find().SetLimit(100).SetSort(bson.M{"createTime": -1}))
if err != nil {
return nil, err
}
data := make([]map[string]interface{}, len(list))
for i, v := range list {
data[i] = map[string]interface{}{
"name": v.Name + "*" + decimal.NewFromInt32(v.Count).String(),
"createTime": v.CreateTime.Format("2006-01-02 15:04:05"),
}
}
return data, nil
}
func Marquee(activityId string) ([]string, error) {
id, err := primitive.ObjectIDFromHex(activityId)
if err != nil {
return nil, err
}
list, err := activitymod.GetMarquee(id)
if err != nil {
return nil, err
}
listLen := len(list)
uids := make([]uint64, listLen)
for i, v := range list {
uids[i] = v.UID
}
userMap := make(map[uint64]string, 10)
if len(uids) > 0 {
userList, err := usermod.FindUsersByUID(uids)
if err != nil {
return nil, err
}
for _, v := range userList {
userMap[v.UID] = v.Name
}
for _, v := range userList {
userMap[v.UID] = v.Name
}
}
strs := make([]string, listLen)
for i, v := range list {
if v.UserName != "" {
strs[i] = fmt.Sprintf("恭喜%s 抽中%s", v.UserName, v.Name)
continue
}
strs[i] = fmt.Sprintf("恭喜%s 抽中%s", userMap[v.UID], v.Name)
}
return strs, nil
}