@@ -0,0 +1,206 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user