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 }