207 lines
5.3 KiB
Go
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
|
|
}
|