周卡活动

dev
mofangmin 1 year ago
parent 11f740b33f
commit 8ab04ca908
  1. 28
      call/activity.go
  2. 28
      call/config.go
  3. 56
      call/pay.go
  4. 2
      cmd/build.sh
  5. 51
      common/activity.go
  6. 1
      common/currency.go
  7. 184
      modules/web/handler/activity.go
  8. 82
      modules/web/handler/recharge.go
  9. 27
      modules/web/values/activity.go
  10. 76
      util/util.go

@ -100,18 +100,8 @@ func ShouldShowActivityFirstRechargeBack(uid int) bool {
if uid == 0 { if uid == 0 {
return true return true
} }
now := time.Now().Unix()
data := GetUserFirstRechargeBackData(uid) data := GetUserFirstRechargeBackData(uid)
if data.RechargeTime == 0 { return data.RewardTime == 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
} }
func UploadActivityData(uid, activityID, t int, amount int64) { func UploadActivityData(uid, activityID, t int, amount int64) {
@ -137,18 +127,12 @@ func ShouldShowActivitySign(uid int) bool {
return now-birth <= 6*common.OneDay return now-birth <= 6*common.OneDay
} }
func GetUserWeekCard(uid, level int) *common.ActivityWeekCardData { func GetUserWeekCard(uid int) *common.ActivityWeekCardData {
data := &common.ActivityWeekCardData{UID: uid, Level: level} data := &common.ActivityWeekCardData{UID: uid}
db.Mysql().Get(data) db.Mysql().Get(data)
return 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 { func ShouldShowActivityWeekCard(uid int) bool {
if !IsActivityValid(common.ActivityIDWeekCard) { if !IsActivityValid(common.ActivityIDWeekCard) {
return false return false
@ -156,12 +140,6 @@ func ShouldShowActivityWeekCard(uid int) bool {
if uid == 0 { if uid == 0 {
return true return true
} }
cards := GetUserWeekCards(uid)
for _, v := range cards {
if v.Day > 0 {
return false
}
}
return true return true
} }

@ -55,7 +55,7 @@ var (
configActivitySign []*common.ConfigActivitySign configActivitySign []*common.ConfigActivitySign
configActivityBreakGift []*common.ConfigActivityBreakGift configActivityBreakGift []*common.ConfigActivityBreakGift
configShareRobot []*common.ConfigShareRobot configShareRobot []*common.ConfigShareRobot
configActivityWeekCard []*common.ConfigActivityWeekCard configActivityWeekCard *common.ConfigActivityWeekCard
configActivitySlots []*common.ConfigActivitySlots configActivitySlots []*common.ConfigActivitySlots
configActivityLuckyShop []*common.ConfigActivityLuckyShop configActivityLuckyShop []*common.ConfigActivityLuckyShop
configServerFlag []*common.ConfigServerFlag configServerFlag []*common.ConfigServerFlag
@ -1353,36 +1353,18 @@ func GetConfigShareRobotByID(robotID int) *common.ConfigShareRobot {
} }
func LoadConfigActivityWeekCard() (err error) { func LoadConfigActivityWeekCard() (err error) {
list := []*common.ConfigActivityWeekCard{} one := new(common.ConfigActivityWeekCard)
if _, err = db.Mysql().QueryAll("", "level", &common.ConfigActivityWeekCard{}, &list); err != nil { if err := db.Mysql().Get(one); err != nil {
log.Error("err:%v", err)
return err return err
} }
for _, v := range list { configActivityWeekCard = one
if len(v.Range) > 0 {
err := json.Unmarshal([]byte(v.Range), &v.SubRange)
if err != nil {
log.Error("err:%v", err)
}
}
}
configActivityWeekCard = list
return nil return nil
} }
func GetConfigActivityWeekCard() []*common.ConfigActivityWeekCard { func GetConfigActivityWeekCard() *common.ConfigActivityWeekCard {
return 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) { func LoadConfigActivitySlots() (err error) {
list := []*common.ConfigActivitySlots{} list := []*common.ConfigActivitySlots{}
if _, err = db.Mysql().QueryAll("", "rank_down", &common.ConfigActivitySlots{}, &list); err != nil { if _, err = db.Mysql().QueryAll("", "rank_down", &common.ConfigActivitySlots{}, &list); err != nil {

@ -536,10 +536,31 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI
func ActivityFirstRechargeBack(r *common.RechargeOrder) { func ActivityFirstRechargeBack(r *common.RechargeOrder) {
if IsActivityValid(common.ActivityIDFirstRechargeBack) { if IsActivityValid(common.ActivityIDFirstRechargeBack) {
conf := GetConfigActivityFirstRechargeBack() conf := GetConfigActivityFirstRechargeBack()
p, _ := GetUserXInfo(r.UID, "birth")
rechargeBackData := GetUserFirstRechargeBackData(r.UID) rechargeBackData := GetUserFirstRechargeBackData(r.UID)
if rechargeBackData.RechargeTime == 0 && r.Amount >= conf.MinRecharge { now := time.Now().Unix()
db.Mysql().Create(&common.ActivityFirstRechargeBackData{UID: r.UID, RechargeTime: time.Now().Unix(), Amount: r.Amount}) // 注册多少时间内
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) { func ActivityWeekCard(r *common.RechargeOrder, product *common.ConfigPayProduct) {
level := product.Exi con := GetConfigActivityWeekCard()
card := GetUserWeekCard(r.UID, level)
con := GetConfigActivityWeekCardByLevel(level)
if con == nil { if con == nil {
return return
} }
if card.ID == 0 { rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: r.UID}, map[string]interface{}{
err := db.Mysql().Create(&common.ActivityWeekCardData{ "recharge_time": time.Now().Unix()})
UID: r.UID, if err != nil || rows == 0 {
Level: level, log.Error("err:%v", err)
DayReward: con.DayReward, return
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
}
} }
// ok // ok
UpdateCurrencyPro(&common.UpdateCurrency{ UpdateCurrencyPro(&common.UpdateCurrency{

@ -8,4 +8,4 @@ cd pb/proto
# go generate # go generate
cd ../.. cd ../..
#go build main.go #go build main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gameserver main.go CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o indiaprovider main.go

@ -201,7 +201,8 @@ const (
type ConfigActivityFirstRechargeBack struct { type ConfigActivityFirstRechargeBack struct {
ID int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"ID"` 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"` 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 { func (c *ConfigActivityFirstRechargeBack) TableName() string {
@ -212,7 +213,7 @@ type ActivityFirstRechargeBackData struct {
UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"`
RechargeTime int64 `gorm:"column:recharge_time;type:bigint(20);default:0;comment:首次充值时间"` RechargeTime int64 `gorm:"column:recharge_time;type:bigint(20);default:0;comment:首次充值时间"`
Amount int64 `gorm:"column:amount;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:领取时间"` RewardTime int64 `gorm:"column:reward_time;type:bigint(20);default:0;comment:领取时间"`
} }
@ -305,16 +306,9 @@ func (c *ConfigActivityBreakGift) TableName() string {
} }
type ConfigActivityWeekCard struct { type ConfigActivityWeekCard struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey"`
Level int `gorm:"column:level;type:int(11);default:1;comment:等级" web:"level"` MiniLimit int64 `gorm:"column:mini_limit;type:bigint(20);default:0;comment:下限" web:"mini_limit"` // 下限
ProductID int `gorm:"column:product_id;type:int(11);default:0;comment:商品id" web:"product_id"` RewardAmount int64 `gorm:"column:reward_amount;type:bigint(20);default:0;comment:前六天奖励金额" web:"reward_amount"` // 前六天奖励金额
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:"-"`
} }
func (c *ConfigActivityWeekCard) TableName() string { func (c *ConfigActivityWeekCard) TableName() string {
@ -326,13 +320,12 @@ const (
) )
type ActivityWeekCardData struct { type ActivityWeekCardData struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey"`
UID int `gorm:"column:uid;type:int(11);uniqueIndex:ul"` UID int `gorm:"column:uid;type:int(11);uniqueIndex:ul"`
Level int `gorm:"column:level;type:int(11);default:0;uniqueIndex:ul;comment:周卡等级"` Rewards string `gorm:"column:rewards;type:varchar(256);comment:前六天领取奖励"`
DayReward int64 `gorm:"column:day_reward;type:bigint(11);default:700000000;comment:每日可领取奖励"` Day int `gorm:"column:day;type:int(11);default:0;comment:已经领取天数"`
Day int `gorm:"column:day;type:int(11);default:6;comment:可领取天数"` LastDraw int64 `gorm:"column:last_draw;type:bigint(20);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:充值时间"`
GetDiscount int `gorm:"column:get_discount;type:tinyint(4);default:0;comment:前面是否已经获得了折扣券"`
} }
func (c *ActivityWeekCardData) TableName() string { func (c *ActivityWeekCardData) TableName() string {
@ -500,18 +493,16 @@ type LuckyData struct {
LastSpinTime int64 LastSpinTime int64
SpinNum int SpinNum int
NextSpinTIme int64 NextSpinTIme int64
Type int SpinCount int // 总次数
} }
type SpinInfo map[int]*LuckyData func (m LuckyData) Value() (driver.Value, error) {
func (m SpinInfo) Value() (driver.Value, error) {
return json.Marshal(m) return json.Marshal(m)
} }
func (m *SpinInfo) Scan(value interface{}) error { func (m *LuckyData) Scan(value interface{}) error {
if value == nil { if value == nil {
*m = SpinInfo{} *m = LuckyData{}
return nil return nil
} }
// 将数据库中的 JSON 字符串解析为 map // 将数据库中的 JSON 字符串解析为 map
@ -520,17 +511,17 @@ func (m *SpinInfo) Scan(value interface{}) error {
return errors.New("type assertion to []byte failed") return errors.New("type assertion to []byte failed")
} }
if len(bytes) == 0 { if len(bytes) == 0 {
*m = SpinInfo{} *m = LuckyData{}
return nil return nil
} }
return json.Unmarshal(bytes, &m) return json.Unmarshal(bytes, &m)
} }
type ActivityBetDrawData struct { type ActivityBetDrawData struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey"`
UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` 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"` 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"` SpinInfo LuckyData `gorm:"column:spin_info;;not null;type:varchar(256);comment:转盘信息" web:"spinInfo"`
} }
func (c *ActivityBetDrawData) TableName() string { func (c *ActivityBetDrawData) TableName() string {

@ -28,6 +28,7 @@ const (
CurrencyResourceBonus // 额外赠送 CurrencyResourceBonus // 额外赠送
CurrencyResourceRechargeBonus // bonus充值 CurrencyResourceRechargeBonus // bonus充值
CurrencyResourceFirstRecharge // 首充 CurrencyResourceFirstRecharge // 首充
CurrencyResourceWeekCard // 周卡
CurrencyResourceAll CurrencyResourceAll
) )

@ -12,6 +12,7 @@ import (
"server/pb" "server/pb"
"server/util" "server/util"
"sort" "sort"
"strings"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -574,42 +575,6 @@ func ActivityFreeSpinDraw(c *gin.Context) {
resp := &values.ActivityFreeSpinDrawResp{} resp := &values.ActivityFreeSpinDrawResp{}
a.Data = resp 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() con := call.GetConfigActivityFreeSpin()
if con == nil { if con == nil {
a.Code = values.CodeRetry a.Code = values.CodeRetry
@ -671,7 +636,7 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) {
conf := call.GetConfigActivityFirstRechargeBack() conf := call.GetConfigActivityFirstRechargeBack()
a.Data = resp a.Data = resp
data := call.GetUserFirstRechargeBackData(a.UID) data := call.GetUserFirstRechargeBackData(a.UID)
log.Debug("ActivityFirstRechargeBackInfo:%+v", data) resp.NeedRechargeAmount = conf.MinRecharge
resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDFirstRechargeBack) resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDFirstRechargeBack)
resp.Recharge = data.Amount resp.Recharge = data.Amount
resp.BackPer = conf.MaxBack resp.BackPer = conf.MaxBack
@ -688,9 +653,15 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) {
val = 0 val = 0
} }
val = val * conf.MaxBack / 100 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.Back = val
resp.PayAmount = rand.Int63n(1000000) + 10000 resp.DrawTime = p.Birth + conf.CD
resp.DrawTime = data.RechargeTime + common.ActivityFirstRechargeBackTime
} }
func ActivityFirstRechargeBackDraw(c *gin.Context) { func ActivityFirstRechargeBackDraw(c *gin.Context) {
@ -703,21 +674,17 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) {
} }
conf := call.GetConfigActivityFirstRechargeBack() conf := call.GetConfigActivityFirstRechargeBack()
data := call.GetUserFirstRechargeBackData(a.UID) 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 { if time.Now().Unix()-data.RechargeTime < common.ActivityFirstRechargeBackTime {
log.Error("not ActivityFirstRechargeBackDraw time:%+v", data) log.Error("not ActivityFirstRechargeBackDraw time:%+v", data)
a.Code = values.CodeRetry a.Code = values.CodeRetry
return 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 { if err != nil || rows == 0 {
a.Code = values.CodeRetry a.Code = values.CodeRetry
return return
} }
val = val * conf.MaxBack / 100 val := data.Reward * conf.MaxBack / 100
_, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{ CurrencyBalance: &common.CurrencyBalance{
UID: a.UID, UID: a.UID,
@ -1299,42 +1266,31 @@ func ActivityWeekCardInfo(c *gin.Context) {
if !a.CheckActivityExpire(common.ActivityIDWeekCard) { if !a.CheckActivityExpire(common.ActivityIDWeekCard) {
return return
} }
cons := call.GetConfigActivityWeekCard()
list := call.GetUserWeekCards(a.UID)
resp := &values.ActivityWeekCardInfoResp{} resp := &values.ActivityWeekCardInfoResp{}
a.Data = resp a.Data = resp
for _, v := range cons { cons := call.GetConfigActivityWeekCard()
product := call.GetConfigPayProductByID(v.ProductID) cardInfo := call.GetUserWeekCard(a.UID)
if product == nil { if cardInfo.ID <= 0 {
continue rewardList, err := util.GenerateSequence(cons.RewardAmount, cons.MiniLimit)
} if err != nil {
one := values.OneWeekCard{ log.Error("err:%v", err)
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,
} }
for _, k := range list { if len(rewardList) == 6 {
if k.Level == v.Level && k.Day > 0 { rewardList = append(rewardList, 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
}
} }
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) { func ActivityWeekCardDraw(c *gin.Context) {
@ -1349,56 +1305,47 @@ func ActivityWeekCardDraw(c *gin.Context) {
if !a.S(req) { if !a.S(req) {
return return
} }
card := call.GetUserWeekCard(a.UID, req.Level) card := call.GetUserWeekCard(a.UID)
if card.ID == 0 { if card.ID == 0 {
a.Code = values.CodeRetry a.Code = values.CodeRetry
return return
} }
if card.Day <= 0 {
a.Code = values.CodeRetry
return
}
now := time.Now().Unix() now := time.Now().Unix()
if util.IsSameDayTimeStamp(now, card.LastDraw) { if util.IsSameDayTimeStamp(now, card.LastDraw) {
a.Code = values.CodeRetry a.Code = values.CodeRetry
a.Msg = "today has reward"
return return
} }
rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: a.UID, Level: req.Level, Day: card.Day}, rewards, _ := util.StringToInt64Slice(card.Rewards, ",")
map[string]interface{}{"day": gorm.Expr("day - 1"), "last_draw": now}) 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 { if rows == 0 || err != nil {
log.Error("err:%v", err) log.Error("err:%v", err)
a.Code = values.CodeRetry a.Code = values.CodeRetry
return return
} }
var reward int64
if card.Day < len(rewards) {
reward = rewards[card.Day] * common.DecimalDigits
} else {
// 第几天折扣券
}
resp := &values.ActivityWeekCardDrawResp{ resp := &values.ActivityWeekCardDrawResp{
Reward: card.DayReward, Reward: reward,
} }
a.Data = resp a.Data = resp
call.UpdateCurrencyPro(&common.UpdateCurrency{ call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{ CurrencyBalance: &common.CurrencyBalance{
UID: a.UID, UID: a.UID,
Type: common.CurrencyINR, Type: common.CurrencyINR,
Value: card.DayReward, Value: reward,
Event: common.CurrencyEventActivityWeekCard, Event: common.CurrencyEventActivityWeekCard,
ChannelID: a.Channel, 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) { func ActivitySlotsInfo(c *gin.Context) {
@ -1863,41 +1810,24 @@ func ActivityBetDrawInfo(c *gin.Context) {
Lucky: drawInfo.Lucky, Lucky: drawInfo.Lucky,
} }
a.Data = resp a.Data = resp
var types []int
var confs []*common.ConfigActivityBetDraw
for _, item := range resp.List { 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 { if resp.Lucky >= item.Cost && vipInfo.Level >= item.VipUnlock {
call.PushRed(a.UID, pb.RedPointModule_RedPointFreeSpin, uint32(1)) call.PushRed(a.UID, pb.RedPointModule_RedPointFreeSpin, uint32(1))
} }
} }
now := time.Now() now := time.Now()
update := false update := false
for _, item := range confs { if !util.IsSameDayTimeStamp(drawInfo.SpinInfo.LastSpinTime, now.Unix()) {
typ := item.Type drawInfo.SpinInfo.SpinNum = 0
spinInfo := drawInfo.SpinInfo[typ] update = true
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 update && a.UID > 0 { if update && a.UID > 0 {
db.Mysql().Update(&common.ActivityBetDrawData{UID: a.UID}, map[string]interface{}{ db.Mysql().Update(&common.ActivityBetDrawData{UID: a.UID}, map[string]interface{}{
"spin_info": drawInfo.SpinInfo, "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) call.UploadActivityData(a.UID, common.ActivityIDBetDraw, common.ActivityDataClick, 0)
} }
@ -1923,11 +1853,7 @@ func ActivityBetDrawDraw(c *gin.Context) {
drawInfo := common.ActivityBetDrawData{UID: a.UID} drawInfo := common.ActivityBetDrawData{UID: a.UID}
db.Mysql().Get(&drawInfo) db.Mysql().Get(&drawInfo)
now := time.Now() now := time.Now()
spinInfo, ok := drawInfo.SpinInfo[req.WheelType] spinInfo := drawInfo.SpinInfo
if !ok {
drawInfo.SpinInfo[req.WheelType] = &common.LuckyData{}
spinInfo = drawInfo.SpinInfo[req.WheelType]
}
// step:判断cd // step:判断cd
if spinInfo.LastSpinTime != 0 && now.Unix()-spinInfo.LastSpinTime < conf.Cd { if spinInfo.LastSpinTime != 0 && now.Unix()-spinInfo.LastSpinTime < conf.Cd {
a.Code = values.CodeRetry a.Code = values.CodeRetry
@ -1959,7 +1885,7 @@ func ActivityBetDrawDraw(c *gin.Context) {
UID: a.UID, UID: a.UID,
}, map[string]interface{}{ }, map[string]interface{}{
"lucky": gorm.Expr("lucky - ?", conf.Cost), "lucky": gorm.Expr("lucky - ?", conf.Cost),
"spin_info": drawInfo.SpinInfo, "spin_info": spinInfo,
}) })
if err != nil { if err != nil {
a.Code = values.CodeRetry a.Code = values.CodeRetry

@ -1,7 +1,6 @@
package handler package handler
import ( import (
"encoding/json"
"fmt" "fmt"
"server/call" "server/call"
"server/config" "server/config"
@ -110,15 +109,16 @@ func RechargeInfo(c *gin.Context) {
TimeLeft: diff, TimeLeft: diff,
// Range: , // Range: ,
} }
con := call.GetConfigActivityWeekCardByLevel(1) // 折扣券
if con != nil { // con := call.GetConfigActivityWeekCardByLevel(1)
resp.DiscountTicket.Range = con.SubRange // if con != nil {
} // resp.DiscountTicket.Range = con.SubRange
if discount > 50 { // }
resp.DiscountTicket.Level = 1 // if discount > 50 {
} else { // resp.DiscountTicket.Level = 1
resp.DiscountTicket.Level = 2 // } else {
} // resp.DiscountTicket.Level = 2
// }
} }
} }
} }
@ -253,39 +253,39 @@ func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeI
ProductID: req.ProductID, ProductID: req.ProductID,
} }
// 只有商城购买才能使用优惠券 // 只有商城购买才能使用优惠券
ticketCon := call.GetConfigActivityWeekCardByLevel(1) // ticketCon := call.GetConfigActivityWeekCardByLevel(1)
if req.ProductID == 0 { if req.ProductID == 0 {
// 首先判断折扣券 // 首先判断折扣券
if ticketCon != nil && len(ticketCon.SubRange) == 2 { // if ticketCon != nil && len(ticketCon.SubRange) == 2 {
if req.Amount >= ticketCon.SubRange[0] && req.Amount <= ticketCon.SubRange[1] { // if req.Amount >= ticketCon.SubRange[0] && req.Amount <= ticketCon.SubRange[1] {
discount := -1 // discount := -1
var ticket *common.PlayerItems // var ticket *common.PlayerItems
// 判断是否有折扣券 // // 判断是否有折扣券
tickets := call.GetUserValidItems(uid, common.ItemDiscountTicket) // tickets := call.GetUserValidItems(uid, common.ItemDiscountTicket)
for i, v := range tickets { // for i, v := range tickets {
thisDiscount := v.Exi1 // thisDiscount := v.Exi1
diff := v.Time + common.ActivityWeekCardTicketExpireTime - time.Now().Unix() // diff := v.Time + common.ActivityWeekCardTicketExpireTime - time.Now().Unix()
if diff <= 0 { // if diff <= 0 {
id := v.ID // id := v.ID
util.Go(func() { // util.Go(func() {
db.Mysql().Update(&common.PlayerItems{ID: id}, map[string]interface{}{"status": common.ItemStatusInvalid}) // db.Mysql().Update(&common.PlayerItems{ID: id}, map[string]interface{}{"status": common.ItemStatusInvalid})
}) // })
continue // continue
} // }
if discount < 0 || thisDiscount < discount { // if discount < 0 || thisDiscount < discount {
discount = thisDiscount // discount = thisDiscount
ticket = tickets[i] // ticket = tickets[i]
} // }
} // }
if discount > 0 { // if discount > 0 {
ticketData := common.ActivityRechargeData{ID: common.ItemDiscountTicket, I1: ticket.Exi1, I2: req.Amount} // ticketData := common.ActivityRechargeData{ID: common.ItemDiscountTicket, I1: ticket.Exi1, I2: req.Amount}
ticketByte, _ := json.Marshal(ticketData) // ticketByte, _ := json.Marshal(ticketData)
order.Extra = string(ticketByte) // order.Extra = string(ticketByte)
req.Amount = common.RoundCurrency(common.CurrencyINR, req.Amount*int64(discount)/100) // req.Amount = common.RoundCurrency(common.CurrencyINR, req.Amount*int64(discount)/100)
order.Amount = req.Amount // order.Amount = req.Amount
} // }
} // }
} // }
} }
re := call.GetRechargeInfo(uid) re := call.GetRechargeInfo(uid)
notCharge := re.TotalRecharge == 0 notCharge := re.TotalRecharge == 0

@ -44,15 +44,16 @@ type ActivityFreeSpinDrawResp struct {
// Recharge 充值总额 // Recharge 充值总额
// Back 可领取的总额 // Back 可领取的总额
type ActivityFirstRechargeBackInfoResp struct { type ActivityFirstRechargeBackInfoResp struct {
Recharge int64 Recharge int64
Back int64 Back int64
BackPer int64 BackPer int64
CanRecharge bool CanRecharge bool
PayAmount int64 // 支付金额 PayAmount int64 // 支付金额
DrawTime int64 // 领取时间 DrawTime int64 // 领取时间
Draw bool // 是否领取 Draw bool // 是否领取
ChannelList []*common.ConfigPayChannels NeedRechargeAmount int64 //
ProductList []*common.ConfigPayProduct ChannelList []*common.ConfigPayChannels
ProductList []*common.ConfigPayProduct
} }
// ID 物品id // ID 物品id
@ -137,7 +138,11 @@ type OneWeekCard struct {
} }
type ActivityWeekCardInfoResp struct { type ActivityWeekCardInfoResp struct {
List []OneWeekCard RewardList []int64 // 奖励列表
RewardDay int // 领取天数
Status bool // 是否可领取
ChannelList []*common.ConfigPayChannels
ProductList []*common.ConfigPayProduct
} }
// Level 领取的周卡的等级 // Level 领取的周卡的等级
@ -265,7 +270,7 @@ type ActivitySuperDrawResp struct {
type ActivityBetDrawInfoResp struct { type ActivityBetDrawInfoResp struct {
List []*common.ConfigActivityBetDraw // 配置 List []*common.ConfigActivityBetDraw // 配置
Lucky int64 // 幸运值 Lucky int64 // 幸运值
SpinInfo []*common.LuckyData SpinInfo []common.LuckyData
} }
type ActivityBetDrawDrawReq struct { type ActivityBetDrawDrawReq struct {

@ -11,6 +11,7 @@ import (
"os" "os"
"reflect" "reflect"
"regexp" "regexp"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -965,3 +966,78 @@ func HashUnmarshal(data map[string]string, v interface{}) error {
return nil 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
}

Loading…
Cancel
Save