|
|
|
|
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 := (configWeekCard.AwardDetails[req.Index].AwardUpper - configWeekCard.AwardDetails[req.Index].AwardLower) / 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
|
|
|
|
|
}
|