diff --git a/call/activity.go b/call/activity.go index 7aa6441..3a5290a 100644 --- a/call/activity.go +++ b/call/activity.go @@ -100,18 +100,8 @@ func ShouldShowActivityFirstRechargeBack(uid int) bool { if uid == 0 { return true } - now := time.Now().Unix() data := GetUserFirstRechargeBackData(uid) - if data.RechargeTime == 0 { - return true - } - if now-data.RechargeTime > 2*common.ActivityFirstRechargeBackTime { - return false - } - if now-data.RechargeTime > common.ActivityFirstRechargeBackTime && data.Lost == 0 { - return false - } - return true + return data.RewardTime == 0 } func UploadActivityData(uid, activityID, t int, amount int64) { @@ -137,18 +127,12 @@ func ShouldShowActivitySign(uid int) bool { return now-birth <= 6*common.OneDay } -func GetUserWeekCard(uid, level int) *common.ActivityWeekCardData { - data := &common.ActivityWeekCardData{UID: uid, Level: level} +func GetUserWeekCard(uid int) *common.ActivityWeekCardData { + data := &common.ActivityWeekCardData{UID: uid} db.Mysql().Get(data) return data } -func GetUserWeekCards(uid int) []*common.ActivityWeekCardData { - list := []*common.ActivityWeekCardData{} - db.Mysql().QueryAll(fmt.Sprintf("uid = %d", uid), "", &common.ActivityWeekCardData{}, &list) - return list -} - func ShouldShowActivityWeekCard(uid int) bool { if !IsActivityValid(common.ActivityIDWeekCard) { return false @@ -156,12 +140,6 @@ func ShouldShowActivityWeekCard(uid int) bool { if uid == 0 { return true } - cards := GetUserWeekCards(uid) - for _, v := range cards { - if v.Day > 0 { - return false - } - } return true } diff --git a/call/config.go b/call/config.go index 21d8a82..d9556bb 100644 --- a/call/config.go +++ b/call/config.go @@ -55,7 +55,7 @@ var ( configActivitySign []*common.ConfigActivitySign configActivityBreakGift []*common.ConfigActivityBreakGift configShareRobot []*common.ConfigShareRobot - configActivityWeekCard []*common.ConfigActivityWeekCard + configActivityWeekCard *common.ConfigActivityWeekCard configActivitySlots []*common.ConfigActivitySlots configActivityLuckyShop []*common.ConfigActivityLuckyShop configServerFlag []*common.ConfigServerFlag @@ -1353,36 +1353,18 @@ func GetConfigShareRobotByID(robotID int) *common.ConfigShareRobot { } func LoadConfigActivityWeekCard() (err error) { - list := []*common.ConfigActivityWeekCard{} - if _, err = db.Mysql().QueryAll("", "level", &common.ConfigActivityWeekCard{}, &list); err != nil { - log.Error("err:%v", err) + one := new(common.ConfigActivityWeekCard) + if err := db.Mysql().Get(one); err != nil { return err } - for _, v := range list { - if len(v.Range) > 0 { - err := json.Unmarshal([]byte(v.Range), &v.SubRange) - if err != nil { - log.Error("err:%v", err) - } - } - } - configActivityWeekCard = list + configActivityWeekCard = one return nil } -func GetConfigActivityWeekCard() []*common.ConfigActivityWeekCard { +func GetConfigActivityWeekCard() *common.ConfigActivityWeekCard { return configActivityWeekCard } -func GetConfigActivityWeekCardByLevel(level int) *common.ConfigActivityWeekCard { - for _, v := range configActivityWeekCard { - if v.Level == level { - return v - } - } - return nil -} - func LoadConfigActivitySlots() (err error) { list := []*common.ConfigActivitySlots{} if _, err = db.Mysql().QueryAll("", "rank_down", &common.ConfigActivitySlots{}, &list); err != nil { diff --git a/call/pay.go b/call/pay.go index e1b39f0..b84acd9 100644 --- a/call/pay.go +++ b/call/pay.go @@ -536,10 +536,31 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI func ActivityFirstRechargeBack(r *common.RechargeOrder) { if IsActivityValid(common.ActivityIDFirstRechargeBack) { conf := GetConfigActivityFirstRechargeBack() + p, _ := GetUserXInfo(r.UID, "birth") rechargeBackData := GetUserFirstRechargeBackData(r.UID) - if rechargeBackData.RechargeTime == 0 && r.Amount >= conf.MinRecharge { - db.Mysql().Create(&common.ActivityFirstRechargeBackData{UID: r.UID, RechargeTime: time.Now().Unix(), Amount: r.Amount}) + now := time.Now().Unix() + // 注册多少时间内 + if p.Birth+conf.CD <= now { + if rechargeBackData.Amount == 0 { + data := &common.ActivityFirstRechargeBackData{UID: r.UID, Amount: r.Amount} + if r.Amount >= conf.MinRecharge { + data.RechargeTime = now + } + db.Mysql().Create(data) + } else { + update := map[string]interface{}{ + "amount": gorm.Expr("amount + ?"), + } + if rechargeBackData.Amount+r.Amount >= conf.MinRecharge { + update["recharge_time"] = time.Now().Unix() + } + err := db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: r.UID}, update) + if err != nil { + log.Error("err:%v", err) + } + } } + } } @@ -601,34 +622,15 @@ func ActivityBreakGift(r *common.RechargeOrder, product *common.ConfigPayProduct } func ActivityWeekCard(r *common.RechargeOrder, product *common.ConfigPayProduct) { - level := product.Exi - card := GetUserWeekCard(r.UID, level) - con := GetConfigActivityWeekCardByLevel(level) + con := GetConfigActivityWeekCard() if con == nil { return } - if card.ID == 0 { - err := db.Mysql().Create(&common.ActivityWeekCardData{ - UID: r.UID, - Level: level, - DayReward: con.DayReward, - Day: con.Day, - // LastDraw: time.Now().Unix(), - }) - if err != nil { - return - } - } else { - if card.Day > 0 { - return - } - rows, err := db.Mysql().UpdateResW(&common.ActivityWeekCardData{}, map[string]interface{}{ - "day": con.Day, "day_reward": con.DayReward, "get_discount": 0, "last_draw": 0}, - fmt.Sprintf("uid = %d and level = %d and day = 0", r.UID, level)) - if err != nil || rows == 0 { - log.Error("err:%v", err) - return - } + rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: r.UID}, map[string]interface{}{ + "recharge_time": time.Now().Unix()}) + if err != nil || rows == 0 { + log.Error("err:%v", err) + return } // ok UpdateCurrencyPro(&common.UpdateCurrency{ diff --git a/cmd/build.sh b/cmd/build.sh index 61a7d07..4b29610 100644 --- a/cmd/build.sh +++ b/cmd/build.sh @@ -8,4 +8,4 @@ cd pb/proto # go generate cd ../.. #go build main.go -CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gameserver main.go \ No newline at end of file +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o indiaprovider main.go \ No newline at end of file diff --git a/common/activity.go b/common/activity.go index 692e521..3258a7b 100644 --- a/common/activity.go +++ b/common/activity.go @@ -201,7 +201,8 @@ const ( type ConfigActivityFirstRechargeBack struct { ID int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"ID"` MinRecharge int64 `gorm:"column:min_recharge;type:bigint(20);default:10000000000;comment:最低充值额度" web:"min_recharge"` - MaxBack int64 `gorm:"column:max_back;type:bigint(20);default:-1;comment:最大返还额度比例" web:"max_back"` + MaxBack int64 `gorm:"column:max_back;type:bigint(20);default:0;comment:最大返还额度比例" web:"max_back"` + CD int64 `gorm:"column:cd;type:bigint(20);default:0;comment:持续时间" web:"cd"` } func (c *ConfigActivityFirstRechargeBack) TableName() string { @@ -212,7 +213,7 @@ type ActivityFirstRechargeBackData struct { UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` RechargeTime int64 `gorm:"column:recharge_time;type:bigint(20);default:0;comment:首次充值时间"` Amount int64 `gorm:"column:amount;type:bigint(20);default:0;comment:总充值金额"` - Lost int64 `gorm:"column:lost;type:bigint(20);default:0;comment:活动时间内总损失"` + Reward int64 `gorm:"column:reward;type:bigint(20);default:0;comment:给定金额"` RewardTime int64 `gorm:"column:reward_time;type:bigint(20);default:0;comment:领取时间"` } @@ -305,16 +306,9 @@ func (c *ConfigActivityBreakGift) TableName() string { } type ConfigActivityWeekCard struct { - ID int `gorm:"primarykey"` - Level int `gorm:"column:level;type:int(11);default:1;comment:等级" web:"level"` - ProductID int `gorm:"column:product_id;type:int(11);default:0;comment:商品id" web:"product_id"` - DayReward int64 `gorm:"column:day_reward;type:bigint(11);default:700000000;comment:每日可领取奖励" web:"day_reward"` - OriginPrice int64 `gorm:"column:origin_price;type:bigint(11);default:5000000000;comment:显示的原价" web:"origin_price"` - Day int `gorm:"column:day;type:int(11);default:6;comment:可领取天数" web:"day"` - Discount int `gorm:"column:discount;type:int(11);default:70;comment:折扣率,百分位" web:"discount"` - Rebate int `gorm:"column:rebate;type:int(11);default:240;comment:返利率,百分位" web:"rebate"` - Range string `gorm:"column:range;default:'[2000000000,100000000000]';type:varchar(255);comment:充值可用范围"` - SubRange []int64 `gorm:"-" json:"-"` + ID int `gorm:"primarykey"` + MiniLimit int64 `gorm:"column:mini_limit;type:bigint(20);default:0;comment:下限" web:"mini_limit"` // 下限 + RewardAmount int64 `gorm:"column:reward_amount;type:bigint(20);default:0;comment:前六天奖励金额" web:"reward_amount"` // 前六天奖励金额 } func (c *ConfigActivityWeekCard) TableName() string { @@ -326,13 +320,12 @@ const ( ) type ActivityWeekCardData struct { - ID int `gorm:"primarykey"` - UID int `gorm:"column:uid;type:int(11);uniqueIndex:ul"` - Level int `gorm:"column:level;type:int(11);default:0;uniqueIndex:ul;comment:周卡等级"` - DayReward int64 `gorm:"column:day_reward;type:bigint(11);default:700000000;comment:每日可领取奖励"` - Day int `gorm:"column:day;type:int(11);default:6;comment:可领取天数"` - LastDraw int64 `gorm:"column:last_draw;type:bigint(20);default:0;comment:上次领取时间"` - GetDiscount int `gorm:"column:get_discount;type:tinyint(4);default:0;comment:前面是否已经获得了折扣券"` + ID int `gorm:"primarykey"` + UID int `gorm:"column:uid;type:int(11);uniqueIndex:ul"` + Rewards string `gorm:"column:rewards;type:varchar(256);comment:前六天领取奖励"` + Day int `gorm:"column:day;type:int(11);default:0;comment:已经领取天数"` + LastDraw int64 `gorm:"column:last_draw;type:bigint(20);default:0;comment:上次领取时间"` + RechargeTime int64 `gorm:"column:recharge_time;type:bigint(20);default:0;comment:充值时间"` } func (c *ActivityWeekCardData) TableName() string { @@ -500,18 +493,16 @@ type LuckyData struct { LastSpinTime int64 SpinNum int NextSpinTIme int64 - Type int + SpinCount int // 总次数 } -type SpinInfo map[int]*LuckyData - -func (m SpinInfo) Value() (driver.Value, error) { +func (m LuckyData) Value() (driver.Value, error) { return json.Marshal(m) } -func (m *SpinInfo) Scan(value interface{}) error { +func (m *LuckyData) Scan(value interface{}) error { if value == nil { - *m = SpinInfo{} + *m = LuckyData{} return nil } // 将数据库中的 JSON 字符串解析为 map @@ -520,17 +511,17 @@ func (m *SpinInfo) Scan(value interface{}) error { return errors.New("type assertion to []byte failed") } if len(bytes) == 0 { - *m = SpinInfo{} + *m = LuckyData{} return nil } return json.Unmarshal(bytes, &m) } type ActivityBetDrawData struct { - ID int `gorm:"primarykey"` - UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` - Lucky int64 `gorm:"column:lucky;;not null;type:bigint(20);comment:幸运值" web:"lucky"` - SpinInfo SpinInfo `gorm:"column:spin_info;;not null;type:varchar(256);comment:转盘信息" web:"spinInfo"` + ID int `gorm:"primarykey"` + UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` + Lucky int64 `gorm:"column:lucky;;not null;type:bigint(20);comment:幸运值" web:"lucky"` + SpinInfo LuckyData `gorm:"column:spin_info;;not null;type:varchar(256);comment:转盘信息" web:"spinInfo"` } func (c *ActivityBetDrawData) TableName() string { diff --git a/common/currency.go b/common/currency.go index c99d194..43e1498 100644 --- a/common/currency.go +++ b/common/currency.go @@ -28,6 +28,7 @@ const ( CurrencyResourceBonus // 额外赠送 CurrencyResourceRechargeBonus // bonus充值 CurrencyResourceFirstRecharge // 首充 + CurrencyResourceWeekCard // 周卡 CurrencyResourceAll ) diff --git a/modules/web/handler/activity.go b/modules/web/handler/activity.go index ca6d35c..bb0a2a4 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -12,6 +12,7 @@ import ( "server/pb" "server/util" "sort" + "strings" "time" "github.com/gin-gonic/gin" @@ -574,42 +575,6 @@ func ActivityFreeSpinDraw(c *gin.Context) { resp := &values.ActivityFreeSpinDrawResp{} a.Data = resp - // 首次旋转,给予固定奖励 - // if freeSpin.LastSpin == 0 { - // items := call.GetConfigActivityFreeSpinByType(common.ActivityFreeSpinItemRandomCash) - // if len(items) == 0 { - // a.Code = values.CodeRetry - // return - // } - // err := db.Mysql().Create(&common.ActivityFreeSpinData{UID: a.UID, LastSpin: time.Now().Unix()}) - // if err != nil { - // a.Code = values.CodeRetry - // return - // } - // resp.Reward = config.GetConfig().Web.FreeSpinFirst - // if resp.Reward == 0 { - // resp.Reward = 5 * common.DecimalDigits - // } - // _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ - // CurrencyBalance: &common.CurrencyBalance{ - // Type: common.CurrencyINR, - // UID: a.UID, - // Event: common.CurrencyEventActivityFreeSpin, - // Value: resp.Reward, - // ChannelID: a.Channel, - // NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, resp.Reward), - // }, - // }) - // if err != nil { - // a.Code = values.CodeRetry - // return - // } - // ran := rand.Intn(len(items)) - // resp.ID = items[ran].ID - // call.UploadActivityData(a.UID, common.ActivityIDFreeSpin, common.ActivityDataJoin, resp.Reward) - // return - // } - con := call.GetConfigActivityFreeSpin() if con == nil { a.Code = values.CodeRetry @@ -671,7 +636,7 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) { conf := call.GetConfigActivityFirstRechargeBack() a.Data = resp data := call.GetUserFirstRechargeBackData(a.UID) - log.Debug("ActivityFirstRechargeBackInfo:%+v", data) + resp.NeedRechargeAmount = conf.MinRecharge resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDFirstRechargeBack) resp.Recharge = data.Amount resp.BackPer = conf.MaxBack @@ -688,9 +653,15 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) { val = 0 } val = val * conf.MaxBack / 100 + now := time.Now().Unix() + p, _ := call.GetUserXInfo(a.UID, "birth") + if p.Birth+conf.CD >= now { + db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: a.UID}, map[string]interface{}{ + "reward": val, + }) + } resp.Back = val - resp.PayAmount = rand.Int63n(1000000) + 10000 - resp.DrawTime = data.RechargeTime + common.ActivityFirstRechargeBackTime + resp.DrawTime = p.Birth + conf.CD } func ActivityFirstRechargeBackDraw(c *gin.Context) { @@ -703,21 +674,17 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) { } conf := call.GetConfigActivityFirstRechargeBack() data := call.GetUserFirstRechargeBackData(a.UID) - val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) - if val <= 0 { - return - } if time.Now().Unix()-data.RechargeTime < common.ActivityFirstRechargeBackTime { log.Error("not ActivityFirstRechargeBackDraw time:%+v", data) a.Code = values.CodeRetry return } - rows, err := db.Mysql().UpdateRes(&common.ActivityFirstRechargeBackData{UID: a.UID}, map[string]interface{}{"lost": 0, "reward_time": time.Now().Unix()}) + rows, err := db.Mysql().UpdateRes(&common.ActivityFirstRechargeBackData{UID: a.UID}, map[string]interface{}{"reward_time": time.Now().Unix()}) if err != nil || rows == 0 { a.Code = values.CodeRetry return } - val = val * conf.MaxBack / 100 + val := data.Reward * conf.MaxBack / 100 _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, @@ -1299,42 +1266,31 @@ func ActivityWeekCardInfo(c *gin.Context) { if !a.CheckActivityExpire(common.ActivityIDWeekCard) { return } - cons := call.GetConfigActivityWeekCard() - list := call.GetUserWeekCards(a.UID) resp := &values.ActivityWeekCardInfoResp{} a.Data = resp - for _, v := range cons { - product := call.GetConfigPayProductByID(v.ProductID) - if product == nil { - continue - } - one := values.OneWeekCard{ - Level: v.Level, - Rebate: fmt.Sprintf("%d", v.Rebate) + "%", - OriginPrice: v.OriginPrice, - Price: product.Amount, - Reward: product.Value, - DayReward: v.DayReward, - DayCount: v.Day, - Discount: fmt.Sprintf("%d", 100-v.Discount), - Next: -1, - ProductID: v.ProductID, - TotalReward: v.DayReward*int64(v.Day) + product.Value, + cons := call.GetConfigActivityWeekCard() + cardInfo := call.GetUserWeekCard(a.UID) + if cardInfo.ID <= 0 { + rewardList, err := util.GenerateSequence(cons.RewardAmount, cons.MiniLimit) + if err != nil { + log.Error("err:%v", err) } - for _, k := range list { - if k.Level == v.Level && k.Day > 0 { - one.DayReward = k.DayReward - one.Day = k.Day - if !util.IsSameDayTimeStamp(k.LastDraw, time.Now().Unix()) { - one.Next = 0 - } else { - one.Next = util.GetZeroTime(time.Now().AddDate(0, 0, 1)).Unix() - k.LastDraw - } - break - } + if len(rewardList) == 6 { + rewardList = append(rewardList, 0) } - resp.List = append(resp.List, one) + resp.RewardList = rewardList + cardInfo.Rewards = strings.Join(util.Int64SliceToStringSlice(rewardList), ",") + db.Mysql().Create(cardInfo) + } + if resp.RewardList == nil { + resp.RewardList, _ = util.StringToInt64Slice(cardInfo.Rewards, ",") + } + if !util.IsSameDayTimeStamp(time.Now().Unix(), cardInfo.LastDraw) { + resp.Status = true } + resp.RewardDay = cardInfo.Day + resp.ChannelList = call.GetConfigPayChannelsByID(common.CurrencyINR) + resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDWeekCard) } func ActivityWeekCardDraw(c *gin.Context) { @@ -1349,56 +1305,47 @@ func ActivityWeekCardDraw(c *gin.Context) { if !a.S(req) { return } - card := call.GetUserWeekCard(a.UID, req.Level) + card := call.GetUserWeekCard(a.UID) if card.ID == 0 { a.Code = values.CodeRetry return } - if card.Day <= 0 { - a.Code = values.CodeRetry - return - } now := time.Now().Unix() if util.IsSameDayTimeStamp(now, card.LastDraw) { a.Code = values.CodeRetry + a.Msg = "today has reward" return } - rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: a.UID, Level: req.Level, Day: card.Day}, - map[string]interface{}{"day": gorm.Expr("day - 1"), "last_draw": now}) + rewards, _ := util.StringToInt64Slice(card.Rewards, ",") + rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: a.UID}, + map[string]interface{}{"day": gorm.Expr("day + 1"), "last_draw": now}) if rows == 0 || err != nil { log.Error("err:%v", err) a.Code = values.CodeRetry return } + var reward int64 + if card.Day < len(rewards) { + reward = rewards[card.Day] * common.DecimalDigits + } else { + // 第几天折扣券 + } + resp := &values.ActivityWeekCardDrawResp{ - Reward: card.DayReward, + Reward: reward, } a.Data = resp call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Type: common.CurrencyINR, - Value: card.DayReward, + Value: reward, Event: common.CurrencyEventActivityWeekCard, ChannelID: a.Channel, - NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, card.DayReward), + NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), }, }) - con := call.GetConfigActivityWeekCardByLevel(card.Level) - if con != nil { - // 最后一天必得一次 - if card.Day == 1 { - call.AddUserDiscountTicket(a.UID, con.Discount) - resp.DiscountTicket = fmt.Sprintf("%d", 100-con.Discount) - } else if card.GetDiscount == 0 { // 未领取过则随机一次 - ran := rand.Intn(card.Day) - if ran == 0 { - db.Mysql().Update(&common.ActivityWeekCardData{UID: a.UID, Level: req.Level}, map[string]interface{}{"get_discount": 1}) - call.AddUserDiscountTicket(a.UID, con.Discount) - resp.DiscountTicket = fmt.Sprintf("%d", 100-con.Discount) - } - } - } + } func ActivitySlotsInfo(c *gin.Context) { @@ -1863,41 +1810,24 @@ func ActivityBetDrawInfo(c *gin.Context) { Lucky: drawInfo.Lucky, } a.Data = resp - var types []int - var confs []*common.ConfigActivityBetDraw for _, item := range resp.List { - if !util.SliceContain(types, item.Type) { - types = append(types, item.Type) - confs = append(confs, item) - } if resp.Lucky >= item.Cost && vipInfo.Level >= item.VipUnlock { call.PushRed(a.UID, pb.RedPointModule_RedPointFreeSpin, uint32(1)) } } now := time.Now() update := false - for _, item := range confs { - typ := item.Type - spinInfo := drawInfo.SpinInfo[typ] - if spinInfo == nil { - drawInfo.SpinInfo[typ] = &common.LuckyData{} - spinInfo = drawInfo.SpinInfo[typ] - } - if !util.IsSameDayTimeStamp(spinInfo.LastSpinTime, now.Unix()) { - spinInfo.SpinNum = 0 - update = true - } - resp.SpinInfo = append(resp.SpinInfo, &common.LuckyData{ - SpinNum: spinInfo.SpinNum, - NextSpinTIme: spinInfo.NextSpinTIme, - Type: typ, - }) + if !util.IsSameDayTimeStamp(drawInfo.SpinInfo.LastSpinTime, now.Unix()) { + drawInfo.SpinInfo.SpinNum = 0 + update = true } if update && a.UID > 0 { db.Mysql().Update(&common.ActivityBetDrawData{UID: a.UID}, map[string]interface{}{ "spin_info": drawInfo.SpinInfo, }) } + drawInfo.SpinInfo.SpinCount = confList[0].LimitNum + resp.SpinInfo = append(resp.SpinInfo, drawInfo.SpinInfo) call.UploadActivityData(a.UID, common.ActivityIDBetDraw, common.ActivityDataClick, 0) } @@ -1923,11 +1853,7 @@ func ActivityBetDrawDraw(c *gin.Context) { drawInfo := common.ActivityBetDrawData{UID: a.UID} db.Mysql().Get(&drawInfo) now := time.Now() - spinInfo, ok := drawInfo.SpinInfo[req.WheelType] - if !ok { - drawInfo.SpinInfo[req.WheelType] = &common.LuckyData{} - spinInfo = drawInfo.SpinInfo[req.WheelType] - } + spinInfo := drawInfo.SpinInfo // step:判断cd if spinInfo.LastSpinTime != 0 && now.Unix()-spinInfo.LastSpinTime < conf.Cd { a.Code = values.CodeRetry @@ -1959,7 +1885,7 @@ func ActivityBetDrawDraw(c *gin.Context) { UID: a.UID, }, map[string]interface{}{ "lucky": gorm.Expr("lucky - ?", conf.Cost), - "spin_info": drawInfo.SpinInfo, + "spin_info": spinInfo, }) if err != nil { a.Code = values.CodeRetry diff --git a/modules/web/handler/recharge.go b/modules/web/handler/recharge.go index 9236950..649a661 100644 --- a/modules/web/handler/recharge.go +++ b/modules/web/handler/recharge.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "fmt" "server/call" "server/config" @@ -110,15 +109,16 @@ func RechargeInfo(c *gin.Context) { TimeLeft: diff, // Range: , } - con := call.GetConfigActivityWeekCardByLevel(1) - if con != nil { - resp.DiscountTicket.Range = con.SubRange - } - if discount > 50 { - resp.DiscountTicket.Level = 1 - } else { - resp.DiscountTicket.Level = 2 - } + // 折扣券 + // con := call.GetConfigActivityWeekCardByLevel(1) + // if con != nil { + // resp.DiscountTicket.Range = con.SubRange + // } + // if discount > 50 { + // resp.DiscountTicket.Level = 1 + // } else { + // resp.DiscountTicket.Level = 2 + // } } } } @@ -253,39 +253,39 @@ func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeI ProductID: req.ProductID, } // 只有商城购买才能使用优惠券 - ticketCon := call.GetConfigActivityWeekCardByLevel(1) + // ticketCon := call.GetConfigActivityWeekCardByLevel(1) if req.ProductID == 0 { // 首先判断折扣券 - if ticketCon != nil && len(ticketCon.SubRange) == 2 { - if req.Amount >= ticketCon.SubRange[0] && req.Amount <= ticketCon.SubRange[1] { - discount := -1 - var ticket *common.PlayerItems - // 判断是否有折扣券 - tickets := call.GetUserValidItems(uid, common.ItemDiscountTicket) - for i, v := range tickets { - thisDiscount := v.Exi1 - diff := v.Time + common.ActivityWeekCardTicketExpireTime - time.Now().Unix() - if diff <= 0 { - id := v.ID - util.Go(func() { - db.Mysql().Update(&common.PlayerItems{ID: id}, map[string]interface{}{"status": common.ItemStatusInvalid}) - }) - continue - } - if discount < 0 || thisDiscount < discount { - discount = thisDiscount - ticket = tickets[i] - } - } - if discount > 0 { - ticketData := common.ActivityRechargeData{ID: common.ItemDiscountTicket, I1: ticket.Exi1, I2: req.Amount} - ticketByte, _ := json.Marshal(ticketData) - order.Extra = string(ticketByte) - req.Amount = common.RoundCurrency(common.CurrencyINR, req.Amount*int64(discount)/100) - order.Amount = req.Amount - } - } - } + // if ticketCon != nil && len(ticketCon.SubRange) == 2 { + // if req.Amount >= ticketCon.SubRange[0] && req.Amount <= ticketCon.SubRange[1] { + // discount := -1 + // var ticket *common.PlayerItems + // // 判断是否有折扣券 + // tickets := call.GetUserValidItems(uid, common.ItemDiscountTicket) + // for i, v := range tickets { + // thisDiscount := v.Exi1 + // diff := v.Time + common.ActivityWeekCardTicketExpireTime - time.Now().Unix() + // if diff <= 0 { + // id := v.ID + // util.Go(func() { + // db.Mysql().Update(&common.PlayerItems{ID: id}, map[string]interface{}{"status": common.ItemStatusInvalid}) + // }) + // continue + // } + // if discount < 0 || thisDiscount < discount { + // discount = thisDiscount + // ticket = tickets[i] + // } + // } + // if discount > 0 { + // ticketData := common.ActivityRechargeData{ID: common.ItemDiscountTicket, I1: ticket.Exi1, I2: req.Amount} + // ticketByte, _ := json.Marshal(ticketData) + // order.Extra = string(ticketByte) + // req.Amount = common.RoundCurrency(common.CurrencyINR, req.Amount*int64(discount)/100) + // order.Amount = req.Amount + // } + // } + // } } re := call.GetRechargeInfo(uid) notCharge := re.TotalRecharge == 0 diff --git a/modules/web/values/activity.go b/modules/web/values/activity.go index 14262ba..6610916 100644 --- a/modules/web/values/activity.go +++ b/modules/web/values/activity.go @@ -44,15 +44,16 @@ type ActivityFreeSpinDrawResp struct { // Recharge 充值总额 // Back 可领取的总额 type ActivityFirstRechargeBackInfoResp struct { - Recharge int64 - Back int64 - BackPer int64 - CanRecharge bool - PayAmount int64 // 支付金额 - DrawTime int64 // 领取时间 - Draw bool // 是否领取 - ChannelList []*common.ConfigPayChannels - ProductList []*common.ConfigPayProduct + Recharge int64 + Back int64 + BackPer int64 + CanRecharge bool + PayAmount int64 // 支付金额 + DrawTime int64 // 领取时间 + Draw bool // 是否领取 + NeedRechargeAmount int64 // + ChannelList []*common.ConfigPayChannels + ProductList []*common.ConfigPayProduct } // ID 物品id @@ -137,7 +138,11 @@ type OneWeekCard struct { } type ActivityWeekCardInfoResp struct { - List []OneWeekCard + RewardList []int64 // 奖励列表 + RewardDay int // 领取天数 + Status bool // 是否可领取 + ChannelList []*common.ConfigPayChannels + ProductList []*common.ConfigPayProduct } // Level 领取的周卡的等级 @@ -265,7 +270,7 @@ type ActivitySuperDrawResp struct { type ActivityBetDrawInfoResp struct { List []*common.ConfigActivityBetDraw // 配置 Lucky int64 // 幸运值 - SpinInfo []*common.LuckyData + SpinInfo []common.LuckyData } type ActivityBetDrawDrawReq struct { diff --git a/util/util.go b/util/util.go index 4d0a5d8..a40bdc4 100644 --- a/util/util.go +++ b/util/util.go @@ -11,6 +11,7 @@ import ( "os" "reflect" "regexp" + "sort" "strconv" "strings" "time" @@ -965,3 +966,78 @@ func HashUnmarshal(data map[string]string, v interface{}) error { return nil } + +func Int64SliceToStringSlice(int64Slice []int64) []string { + stringSlice := make([]string, len(int64Slice)) + for i, num := range int64Slice { + stringSlice[i] = strconv.FormatInt(num, 10) + } + return stringSlice +} + +func StringToInt64Slice(s, sep string) ([]int64, error) { + // 使用分隔符拆分字符串 + parts := strings.Split(s, sep) + + // 创建一个空的 []int64 切片用于存储转换后的数字 + int64Slice := make([]int64, len(parts)) + + // 遍历拆分后的字符串部分并转换为 int64 + for i, part := range parts { + num, err := strconv.ParseInt(part, 10, 64) + if err != nil { + return nil, err // 如果转换失败,返回错误 + } + int64Slice[i] = num + } + + return int64Slice, nil +} + +// 通过总数Count分成一个递增数列 +func GenerateSequence(totalSum, minValue int64) ([]int64, error) { + length := 6 + + // 初步生成递增数列 [minValue, minValue+1, ..., minValue+5] + sequence := make([]int64, length) + for i := 0; i < length; i++ { + sequence[i] = minValue + int64(i) + } + + // 计算初步数列的总和 + sumInitial := (2*minValue + int64(length-1)) * int64(length) / 2 + + // 如果初步数列的总和已经大于 totalSum,则无法生成 + if sumInitial > totalSum { + return nil, fmt.Errorf("cannot generate a sequence with the given totalSum and minValue") + } + + // 计算剩余需要分配的值 + remaining := totalSum - sumInitial + + // 设置随机种子 + rand.Seed(time.Now().UnixNano()) + + // 平均分配剩余的值,同时减少极端情况的出现 + for remaining > 0 { + // 每次迭代从头到尾随机增量分配,减少单个元素过度增长 + for i := 0; i < length && remaining > 0; i++ { + // 确保递增,计算可能的最大增量 + maxIncrement := remaining / int64(length-i) + if i > 0 && sequence[i] <= sequence[i-1] { + maxIncrement = sequence[i-1] - sequence[i] + 1 + } + + // 随机选择增量 + if maxIncrement > 0 { + randIncrement := rand.Int63n(maxIncrement + 1) + sequence[i] += randIncrement + remaining -= randIncrement + } + } + } + sort.Slice(sequence, func(i, j int) bool { + return sequence[i] < sequence[j] + }) + return sequence, nil +}