周卡活动

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 {
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
}

@ -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 {

@ -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{

@ -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
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o indiaprovider main.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 {

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

@ -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

@ -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

@ -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 {

@ -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
}

Loading…
Cancel
Save