package handler import ( "fmt" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" "gorm.io/gorm" "math/rand" "server/call" "server/common" "server/db" "server/modules/web/app" "server/modules/web/values" "server/util" "time" ) func WeekCardInfo(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() a.GetUID() resp := &values.WeekCardInfoResp{} a.Data = resp uid := a.UID cons := call.GetConfigWeekCard() if cons == nil { a.Code = values.CodeRetry return } weekCardData, err := call.GetWeekCardData(uid) if err != nil { log.Error("get week card data err, %s", err.Error()) a.Code = values.CodeRetry return } resp.Amount = cons.Amount resp.List = make([]values.WeekCardDay, 0, len(cons.AwardDetails)) now := time.Now() for index := 1; index <= 7; index++ { var state int if weekCardData != nil && weekCardData.ID != 0 && weekCardData.BeginAt != 0 { // 已经购买周卡的情况下 resp.IsUnlock = true if util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) { resp.Time = int64(util.GetZeroTime(now.AddDate(0, 0, 1)).Sub(now).Seconds()) } if weekCardData.AwardTimes >= index { state = 2 } else if weekCardData.AwardTimes < index { state = 0 if !util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) && weekCardData.AwardTimes+1 == index { state = 1 } } } award := cons.AwardDetails[index] var coinDesc string if award.AwardLower == award.AwardUpper || award.AwardUpper == 0 { coinDesc = fmt.Sprintf("₹%d", award.AwardLower) } else { coinDesc = fmt.Sprintf("₹%d-₹%d", award.AwardLower, award.AwardUpper) } resp.List = append(resp.List, values.WeekCardDay{ State: state, Coin: coinDesc, }) } products := call.GetConfigPayProductByActivityID(common.ActivityIDWeekCard) for _, v := range products { if v.Amount == resp.Amount*common.DecimalDigits { resp.ProductId = v.ProductID break } } } func WeekCardDraw(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.WeekCardDrawReq) if !a.S(req) { return } resp := &values.WeekCardDrawResp{} a.Data = resp uid := a.UID if !db.Redis().Lock(common.GetRedisKeyWeekCard(uid)) { a.Code = values.CodeRetry return } defer func() { db.Redis().UnLock(common.GetRedisKeyWeekCard(uid)) }() configWeekCard := call.GetConfigWeekCard() if configWeekCard == nil { log.Error("get week card config is nil") a.Code = values.CodeRetry a.Msg = "Illegal request" return } weekCardData, err := call.GetWeekCardData(uid) if err != nil { log.Error("get week card data err, %s", err.Error()) a.Code = values.CodeRetry return } now := time.Now() if weekCardData.ID == 0 || weekCardData.BeginAt == 0 { a.Code = values.CodeRetry a.Msg = "Not unlocked Week Card" return } if util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) { a.Code = values.CodeRetry a.Msg = "Already received today" return } if req.Index != weekCardData.AwardTimes+1 { a.Code = values.CodeRetry a.Msg = "Illegal request" return } var awardCount int64 maxAwardCount := weekCardData.CardPrice * 2 * common.DecimalDigits // 总奖励金额 lessAwardCount := maxAwardCount - weekCardData.AwardTotal // 剩余奖励金额 if req.Index == 7 { // 最后一天 awardCount = int64(maxAwardCount - weekCardData.AwardTotal) } else { tryCount := 10 awardOffset := 0 lessMinAwardCount := 0 // 剩下每天的最低金额 lessMaxAwardCount := 0 // 剩下每天的最大金额 for index := req.Index + 1; index <= 7; index++ { lessMinAwardCount += configWeekCard.AwardDetails[index].AwardLower * common.DecimalDigits lessMaxAwardCount += configWeekCard.AwardDetails[index].AwardUpper * common.DecimalDigits } try: awardDetail := configWeekCard.AwardDetails[req.Index] if awardDetail.AwardUpper == awardDetail.AwardLower || awardDetail.AwardUpper == 0 { awardCount = int64(awardDetail.AwardUpper * common.DecimalDigits) } else { randValue := (awardDetail.AwardUpper - awardDetail.AwardLower) + awardOffset if randValue < 0 { randValue = 1 } awardCount = int64((rand.Intn(randValue) + awardDetail.AwardLower) * common.DecimalDigits) } if lessMinAwardCount+int(awardCount) > lessAwardCount || lessMaxAwardCount+int(awardCount) < lessAwardCount { // 当前金额+之后每天最低金额比剩余金额还大的时候 if tryCount > 0 { tryCount-- if lessMinAwardCount+int(awardCount) > lessAwardCount { awardOffset -= 10 * common.DecimalDigits } else if lessMaxAwardCount+int(awardCount) < lessAwardCount { awardOffset += 10 * common.DecimalDigits } goto try } log.Error("uid:%d weekCard draw err, lessAward:%d lessMinAward:%d lessMaxAward:%d | awardCount:%d awardOffset:%d", uid, lessAwardCount, lessMinAwardCount, lessMaxAwardCount, awardCount, awardOffset) a.Code = values.CodeRetry return } } if int(awardCount)+weekCardData.AwardTotal > maxAwardCount { awardCount = int64(maxAwardCount - weekCardData.AwardTotal) } if awardCount <= 0 { a.Code = values.CodeRetry return } _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Type: common.CurrencyINR, Value: awardCount, Event: common.CurrencyEventActivityWeekCard, ChannelID: a.Channel, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, awardCount, configWeekCard.BetMultiples), }, }) if err != nil { log.Error("update currency err, %s", err.Error()) return } updates := make(map[string]interface{}) if req.Index == 7 { updates["begin_at"] = 0 updates["award_times"] = 0 updates["award_at"] = 0 updates["award_total"] = 0 updates["card_price"] = 0 updates["award_total_history"] = gorm.Expr("`award_total_history` + ?", awardCount) } else { updates["award_total"] = gorm.Expr("award_total + ?", awardCount) updates["award_times"] = gorm.Expr("`award_times` + ?", 1) updates["award_at"] = now.Unix() updates["award_total_history"] = gorm.Expr("`award_total_history` + ?", awardCount) } err = db.Mysql().C().Model(&common.WeekCardData{}).Where("id = ?", weekCardData.ID).Updates(updates).Error if err != nil { log.Error("update week card data err, %s", err.Error()) } resp.Reward = awardCount return }