Compare commits

..

11 Commits

  1. 2
      call/activity.go
  2. 9
      call/config.go
  3. 61
      call/luckyWheel.go
  4. 5
      call/pay.go
  5. 11
      call/pdd.go
  6. 3
      call/share.go
  7. 65
      call/task.go
  8. 19
      call/user.go
  9. 5
      common/redis_keys.go
  10. 62
      common/task.go
  11. 5
      modules/backend/handler/firstpage.go
  12. 2
      modules/backend/handler/guser/getGameUserRechargeHistory.go
  13. 16
      modules/backend/models/db.go
  14. 3
      modules/hall/player.go
  15. 164
      modules/web/handler/activity.go
  16. 2
      modules/web/handler/h5.go
  17. 70
      modules/web/handler/luckyWheel.go
  18. 90
      modules/web/handler/task.go
  19. 57
      modules/web/handler/user.go
  20. 93
      modules/web/providers/sn/handler.go
  21. 1
      modules/web/routers/routers_task.go
  22. 26
      modules/web/values/task.go
  23. 2
      pb/proto/platform.proto

@ -253,7 +253,7 @@ func ShouldShowActivityLuckShop(uid int) (result bool) {
return
}
rechargeInfo := GetRechargeInfo(uid)
if rechargeInfo.TotalRechargeCount <= int64(luckyWheel.RechargeCount) {
if rechargeInfo.TotalRechargeCount < int64(luckyWheel.RechargeCount) {
return
}
return true

@ -1384,6 +1384,9 @@ func LoadConfigTask() (err error) {
}
func GetConfigTask() []*common.ConfigTask {
if len(configTask) == 0 {
LoadConfigTask()
}
return configTask
}
@ -2678,6 +2681,9 @@ func LoadConfigRtpControl() (err error) {
}
func GetConfigRtpControl() []*common.ConfigRtpControl {
if len(configRtpControl) == 0 {
LoadConfigRtpControl()
}
return configRtpControl
}
@ -2712,6 +2718,9 @@ func GetConfigRtpTemplate() []*common.ConfigRtpTemplate {
}
func GetConfigRtpTemplateId() string {
if len(configTemplates) == 0 {
LoadConfigRtpTemplate()
}
for _, v := range configTemplates {
if v.Open == 1 && v.TemplateId != "" {
return v.TemplateId

@ -1,9 +1,12 @@
package call
import (
"encoding/json"
"fmt"
"github.com/liangdas/mqant/log"
"server/common"
"server/db"
"server/pb"
"time"
)
@ -58,3 +61,61 @@ func GetLuckWheelRecords(uid, withoutUid, page, pageSize int) (
}
return
}
func CheckLuckyWheel(uid int, unPush ...bool) {
if !db.Redis().Lock(common.GetRedisKeyLuckyWheel(uid)) {
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyLuckyWheel(uid))
}()
luckyWheel := GetConfigLuckyWheel()
if luckyWheel == nil {
return
}
rechargeInfo := GetRechargeInfo(uid)
playerData := GetPlayerData(uid)
if rechargeInfo.TotalRechargeCount < int64(luckyWheel.RechargeCount) {
return
}
var (
update bool
lessCount int
)
for _, wheelCfg := range luckyWheel.WheelCfgStr {
lessKey := fmt.Sprintf("l%d", wheelCfg.LuckyType)
for _, rechargeAmount := range wheelCfg.RechargeAmount {
if rechargeAmount == 0 {
continue
}
freeKey := fmt.Sprintf("f%d_%d", wheelCfg.LuckyType, rechargeAmount)
if rechargeInfo.TotalRecharge >= int64(rechargeAmount)*common.DecimalDigits &&
playerData.LuckyWheelMap[freeKey] == 0 {
playerData.LuckyWheelMap[freeKey] = 1
playerData.LuckyWheelMap[lessKey] += 1
update = true
}
lessCount += playerData.LuckyWheelMap[lessKey]
}
}
if update {
luckyWheelBytes, err := json.Marshal(playerData.LuckyWheelMap)
if err != nil {
log.Error("marshal err, %s", err.Error())
return
}
err = db.Mysql().C().Model(&common.PlayerData{}).Where("uid = ?", uid).Updates(map[string]interface{}{
"lucky_wheel": string(luckyWheelBytes),
}).Error
if err != nil {
log.Error("update err, %s", err.Error())
return
}
}
if len(unPush) > 0 && unPush[0] {
return
}
if lessCount > 0 {
PushRed(uid, pb.RedPointModule_RedPointLuckyWheel, 1)
}
}

@ -581,7 +581,9 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI
// VIP
UpdateVip(r.UID, r.Amount, 0, 0)
// 检查任务
CheckTask(Task{Uid: r.UID, Value: r.Amount, Types: []common.TaskType{common.TaskTypeOnceRecharge}})
CheckTask(Task{r.UID, 1, []common.TaskType{common.TaskTypeRecharge}})
// 检测转盘
CheckLuckyWheel(r.UID)
// 检查所有活动
CheckAllActivity(r)
@ -660,6 +662,7 @@ func CheckAllActivity(r *common.RechargeOrder) {
switch r.ActivityID {
case common.ActivityIDWeekCard:
ActivityWeekCard(r, product)
CheckTask(Task{r.UID, 1, []common.TaskType{common.TaskTypeUnlockWeekCard}})
//case common.ActivityIDBreakGift:
// ActivityBreakGift(r, product)
//case common.ActivityIDLuckyShop:

@ -4,6 +4,7 @@ import (
"github.com/liangdas/mqant/log"
"server/common"
"server/db"
"server/pb"
"time"
)
@ -56,3 +57,13 @@ func GetWeekCardData(uid int) (result *common.WeekCardData, err error) {
}
return
}
func CheckPdd(uid int) {
pddData, err := GetPddData(uid)
if err != nil {
return
}
if pddData.Spin > 0 {
PushRed(uid, pb.RedPointModule_RedPointPdd, uint32(pddData.Spin))
}
}

@ -158,6 +158,9 @@ func ShareBind(share string, isOld bool, uid, cid int) {
log.Error("update share invite task err, %s", err.Error())
return
}
// 邀请任务
CheckTask(Task{upInfo.UID, 1, []common.TaskType{common.TaskTypeInviter}})
}
})
}

@ -3,6 +3,7 @@ package call
import (
"server/common"
"server/db"
"server/pb"
"time"
"github.com/liangdas/mqant/log"
@ -10,42 +11,42 @@ import (
)
type Task struct {
Uid int // uid
Uid int // uid
Value int64 // 进度值
Types []common.TaskType // 任务类型
Value int64 // 进度值
}
func CheckTask(task Task) (taskId int) {
/*
todo 检查(根据场景进来获取查询任务更新进度)
*/
return
log.Info("checkTask task:%v", task)
now := time.Now().Unix()
con := GetConfigTask()
uid := task.Uid
for _, v := range con {
for _, t := range task.Types {
if (t == common.TaskTypeOnceRecharge || t == common.TaskTypeInvite || t == common.TaskTypeDownload) && v.Type == t { // 单次充值任务 || 首次充值任务 || v.Type == common.TaskTypeFirstRecharge)
data := GetUserTaskDataByTaskID(task.Uid, v.TaskID)
if data.ID == 0 {
db.Mysql().Create(&common.TaskData{UID: uid, TaskID: v.TaskID, Time: now, Progress: v.Target})
} else if data.Progress == 0 {
db.Mysql().Update(&common.TaskData{UID: uid, TaskID: v.TaskID}, map[string]interface{}{"progress": v.Target, "time": now})
}
taskId = v.TaskID
break
} else if (t == common.TaskTypeBet1000 || t == common.TaskTypeBet10000 || t == common.TaskTypePlayGame) && v.Type == t {
data := GetUserTaskDataByTaskID(task.Uid, v.TaskID)
if data.ID == 0 {
db.Mysql().Create(&common.TaskData{UID: uid, TaskID: v.TaskID, Time: now, Progress: task.Value})
} else {
db.Mysql().Update(&common.TaskData{UID: uid, TaskID: v.TaskID}, map[string]interface{}{"progress": gorm.Expr("progress + ?", task.Value), "time": now})
}
taskId = v.TaskID
break
}
func CheckTask(task Task, onlyCheck ...bool) (taskId int) {
log.Info("checkTask task:%v, onlyCheck:%+v", task, onlyCheck)
now := time.Now()
push := func() {
var doneCount int64
err := db.Mysql().C().Model(&common.TaskData{}).
Where("uid = ? and task_status = 0 and (end_at >= ? or end_at = -1) and task_value >= target_value", task.Uid, now.Unix()).
Count(&doneCount).Error
if err != nil {
log.Error("get task done count err, %s", err.Error())
}
if doneCount > 0 {
PushRed(task.Uid, pb.RedPointModule_RedPointTaskDraw, uint32(doneCount))
}
}
if len(onlyCheck) > 0 && onlyCheck[0] {
push()
return
}
for _, taskType := range task.Types {
err := db.Mysql().C().Model(&common.TaskData{}).
Where("uid = ? and task_type = ? and task_status = 0 and (end_at >= ? or end_at = -1)", task.Uid, taskType, now.Unix()).
Updates(map[string]interface{}{
"task_value": gorm.Expr("task_value + ?", task.Value),
}).Error
if err != nil {
log.Error("update task progress err, %+v:%d:%s", task, taskType, err.Error())
continue
}
}
push()
return
}

@ -633,7 +633,7 @@ func UpdatePlayerProfile(data *common.ESGameData) error {
// 更新vip
UpdateVip(uid, 0, bet, settle)
// 检查任务
CheckTask(Task{Uid: uid, Value: bet / 100, Types: []common.TaskType{common.TaskTypePlayGame, common.TaskTypeBet1000, common.TaskTypeBet10000}})
CheckTask(Task{Uid: uid, Value: bet, Types: []common.TaskType{common.TaskTypeBet}})
// 日打码量
playerData := GetPlayerData(uid)
updates := make(map[string]interface{})
@ -693,18 +693,23 @@ func GetUserNeedBet(uid int) int64 {
return pro.NeedBet
}
func GetUserTaskData(uid int) (ret []common.TaskData) {
func GetUserTaskData(uid int) (ret []*common.TaskData) {
if uid == 0 {
return
}
db.Mysql().QueryAll(fmt.Sprintf("uid = %d", uid), "", &common.TaskData{}, &ret)
db.Mysql().QueryAll(fmt.Sprintf("uid = %d and (end_at >= %d or end_at = -1)", uid, time.Now().Unix()), "task_status >= 0", &common.TaskData{}, &ret)
return
}
func GetUserTaskDataByTaskID(uid, taskID int) *common.TaskData {
data := &common.TaskData{UID: uid, TaskID: taskID}
db.Mysql().GetLast(data)
return data
func GetUserTaskDataByTaskID(uid, taskID int) (result common.TaskData, err error) {
err = db.Mysql().C().Model(&common.TaskData{}).
Where("uid = ? and task_id = ? and (end_at >= ? or end_at = -1)", uid, taskID, time.Now().Unix()).
Find(&result).Error
if err != nil {
log.Error("get user task data err, %s", err.Error())
return
}
return
}
func UpdateUserNeedBet(uid int, amount int64) {

@ -54,6 +54,7 @@ const (
RedisKeyWeekCard = "week_card"
RedisKeyUserPay = "user_pay"
RedisKeyFirstRechargeBack = "first_recharge_back"
RedisKeyTask = "task"
)
const (
@ -229,3 +230,7 @@ func GetRedisKeyUserPay(payChannelId, uid, amount int) string {
func GetRedisKeyFirstRechargeBack(uid int) string {
return fmt.Sprintf("%v:%v", RedisKeyFirstRechargeBack, uid)
}
func GetRedisKeyTask(uid int) string {
return fmt.Sprintf("%v:%v", RedisKeyTask, uid)
}

@ -1,16 +1,18 @@
package common
import "time"
type TaskType int
const (
TaskTypeZero TaskType = iota
TaskTypeOnceRecharge // 单次充值任务
TaskTypeInvite // 邀请好友
TaskTypePlayGame // 参与一次牌局
TaskTypeBet1000 // 累计下注1000
TaskTypeBet10000 // 累计下注10000
TaskTypeDownload // app下载
TaskTypeAll
TaskTypeZero TaskType = iota
TaskTypeInviter // 邀请好友
TaskTypeRecharge // 充值次数
TaskTypeBet // 累计下注
TaskTypeUnlockWeekCard // 解锁周卡
TaskTypeJoinChannel // 加入频道
TaskTypeDownload // app下载
)
// TaskTypeFirstRecharge // 首次充值任务
@ -56,17 +58,24 @@ const (
// Kind 1单次 2循环
// Type 1注册 2下载 3累充 4单次充
type ConfigTask struct {
ID int `gorm:"primary_key;AUTO_INCREMENT;column:id"`
TaskID int `gorm:"column:task_id;type:int(11);default:0;uniqueIndex:task_id;comment:任务id" web:"task_id"`
Target int64 `gorm:"column:target;type:bigint(20);default:0;comment:任务目标" web:"target"`
Reward int64 `gorm:"column:reward;type:bigint(20);default:0;comment:奖励" web:"reward"`
Open int `gorm:"column:open;type:int(11);default:1;comment:开关 1打开" web:"open"`
Kind int `gorm:"column:kind;type:int(11);default:1;comment:1单次 2循环 3 每日一次" web:"kind"`
Type TaskType `gorm:"column:type;type:int(11);default:1;comment:1注册 2下载" web:"type"`
Title string `gorm:"column:title;type:varchar(256);default:'';comment:标题" web:"title"`
Icon string `gorm:"column:icon;type:varchar(256);default:'';comment:图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);default:0;comment:排序" web:"sort"`
Action int `gorm:"column:action;type:int(11);default:1;comment:跳转类型" web:"action"`
ID int `gorm:"primary_key;AUTO_INCREMENT;column:id"`
Open int `gorm:"column:open;type:int(11);default:1;comment:开关 1打开" web:"open"`
TaskID int `gorm:"column:task_id;type:int(11);default:0;uniqueIndex:task_id;comment:任务id" web:"task_id"`
Target int64 `gorm:"column:target;type:bigint(20);default:0;comment:任务目标" web:"target"`
Reward int64 `gorm:"column:reward;type:bigint(20);default:0;comment:奖励" web:"reward"`
Type TaskType `gorm:"column:type;type:int(11);default:1;comment:任务类型(1:邀请玩家注册,2:充值,3:下注额,4:解锁周卡,5:订阅频道)" web:"type"`
Cycle int `gorm:"column:cycle;type:int(11);default:1;comment:1每日 2每周 3每月 4单次" web:"cycle"`
Sort int `gorm:"column:sort;type:int(11);default:0;comment:排序" web:"sort"`
Title string `gorm:"column:title;type:varchar(256);default:'';comment:标题" web:"title"`
Remark string `gorm:"column:remark;type:varchar(256);default:'';comment:备注" web:"remark"`
PreTaskId int `gorm:"column:pre_task_id;type:int(11);default:0;comment:前置任务id" web:"pre_task_id"`
Url string `gorm:"column:url;type:varchar(256);default:'';comment:跳转链接" web:"url"`
Expand string `gorm:"column:expand;type:varchar(256);default:'';comment:扩展信息" web:"expand"`
}
type ConfigTaskStr struct {
*ConfigTask
Exist bool
}
func (c *ConfigTask) TableName() string {
@ -74,11 +83,16 @@ func (c *ConfigTask) TableName() string {
}
type TaskData struct {
ID int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"ID"`
UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid" json:"UID"`
Time int64 `gorm:"column:time;not null;type:bigint(20);default:0;comment:任务生成时间" json:"Time"`
TaskID int `gorm:"column:task_id;type:int(11);default:0;uniqueIndex:uid;comment:任务id" web:"task_id"`
Progress int64 `gorm:"column:progress;type:bigint(20);default:0;comment:进度" web:"progress"`
ID int64 `gorm:"primary_key;AUTO_INCREMENT;column:id"` // 自增id
UID int `gorm:"column:uid;type:int(11);not null;uniqueIndex:task_idx,priority:1;comment:玩家id" json:"uid"` // 玩家id
TaskID int `gorm:"column:task_id;type:int(11);not null;uniqueIndex:task_idx,priority:2;comment:任务id" json:"task_id"` // 任务id
TaskType int `gorm:"column:task_type;type:int(11);not null;comment:任务类型(1:邀请玩家注册,2:充值,3:下注额,4:解锁周卡,5:订阅频道)" json:"task_type"` // 任务类型(1:邀请玩家注册,2:充值,3:下注额,4:解锁周卡,5:订阅频道)
TaskValue int `gorm:"column:task_value;type:int(11);not null;comment:任务值" json:"task_value"` // 任务值
TargetValue int `gorm:"column:target_value;type:int(11);not null;comment:目标值" json:"target_value"` // 目标值
TaskStatus int `gorm:"column:task_status;type:int(11);not null;comment:任务状态(-1:未开启,0:未完成,1:已完成,2:已领取)" json:"task_status"` // 任务状态(-1:未开启,0:未完成,1:已完成,2:已领取)
EndAt int64 `gorm:"column:end_at;type:bigint(20);not null;comment:任务终止时间" json:"end_at"` // 任务终止时间
CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;comment:创建时间" json:"created_at"` // 创建时间
UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;comment:更新时间" json:"updated_at"` // 更新时间
}
func (c *TaskData) TableName() string {

@ -103,6 +103,9 @@ func GetFirstPageData(start, end int64, channels ...*int) *values.FirstPageData
// 赠送总额
ret.WithdrawTotal = models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyINR, channels...)
// 提现中的钱
withdrawingTotal := models.GetWithdrawingAmountTotalBySQLs(start, end, common.CurrencyINR, channels...)
// 发起充值订单数
ret.RechargeOrderCreate = models.GetOrderCount(start, end, common.StatusROrderCreate, 1, channels...)
@ -119,7 +122,7 @@ func GetFirstPageData(start, end int64, channels ...*int) *values.FirstPageData
ret.RechargeSuccessPer = utils.GetPer(ret.RechargeOrderFinish, ret.RechargeOrderCreate)
// 充值赠送比
ret.WithdrawPer = utils.GetPer(ret.WithdrawTotal, ret.RechargeTotal)
ret.WithdrawPer = utils.GetPer(ret.WithdrawTotal+withdrawingTotal, ret.RechargeTotal)
// 平台下注
ret.Bet = models.GetGameInOut(start, end, 1, channels...)

@ -47,7 +47,7 @@ func GetGameUserRechargeHistory(c *gin.Context) {
successCount := db.Mysql().Count(&common.RechargeOrder{}, fmt.Sprintf("uid = %v and (event = %v or event = %v or event = %v) and status = %v", req.UID, common.CurrencyEventReCharge, common.CurrencyEventGMRecharge, common.CurrencyEventActivityWeekCard, common.StatusROrderPay))
resp.RechargeSuccessPer = utils.GetPer(successCount, resp.RechargeCount)
} else if req.OrderID != "" {
resp.Count, _ = db.Mysql().QueryList(req.Page-1, req.Num, fmt.Sprintf(`event = %v or event = %v and (apipayid = "%v" or orderid = "%v")`, common.CurrencyEventReCharge, common.CurrencyEventActivityWeekCard, req.OrderID, req.OrderID), "create_time desc", &common.RechargeOrder{}, &ret)
resp.Count, _ = db.Mysql().QueryList(req.Page-1, req.Num, fmt.Sprintf(`(event = %v or event = %v) and (apipayid = "%v" or orderid = "%v")`, common.CurrencyEventReCharge, common.CurrencyEventActivityWeekCard, req.OrderID, req.OrderID), "create_time desc", &common.RechargeOrder{}, &ret)
// log.Debug("ret:%v", ret)
for _, v := range ret {
resp.List = append(resp.List, values.OneRechargeList{UID: v.UID, Time: v.CreateTime, CallbackTime: v.CallbackTime, CurrencyType: v.CurrencyType,

@ -1366,6 +1366,22 @@ func GetWithdrawAmountTotalBySQLs(s, e int64, t common.CurrencyType, channel ...
return amount
}
// 通过sql查询代付金额
func GetWithdrawingAmountTotalBySQLs(s, e int64, t common.CurrencyType, channel ...*int) int64 {
var amount int64
if s == e {
e += 24 * 60 * 60
}
sql := fmt.Sprintf(`SELECT IFNULL(SUM(amount),0) as amount FROM withdraw_order WHERE event = %v and status in (%v,%v,%v,%v,%v,%v) and callback_time >= %d and callback_time < %d and currency_type = %d`,
common.CurrencyEventWithDraw, common.StatusROrderWaitting, common.StatusROrderCreate, common.StatusROrderPay, common.StatusROrderFail, common.StatusROrderCancel, common.StatusROrderPending, s, e, t)
sql += PackChannels(channel...)
err := db.Mysql().QueryBySql(sql, &amount)
if err != nil {
log.Error("查询支付总金额失败, error : [%s]", err.Error())
}
return amount
}
// 获取首充人数
func GetFirstPayCount(s, e int64, t common.CurrencyType, channel ...*int) int64 {
q := elastic.NewBoolQuery()

@ -21,6 +21,9 @@ type player struct {
func (p *player) PushRedPoint() {
call.PushRed(p.db.Id, pb.RedPointModule_RedPointFreeCash, uint32(1))
call.CheckTask(call.Task{Uid: p.db.Id}, true)
call.CheckLuckyWheel(p.db.Id)
call.CheckPdd(p.db.Id)
call.PushMailRed(p.db.Id)
call.PushVipRed(p.db.Id)
call.PushWeekCard(p.db.Id)

@ -2,6 +2,7 @@ package handler
import (
"fmt"
"gorm.io/gorm/clause"
"math/rand"
"server/call"
"server/common"
@ -22,74 +23,112 @@ import (
// GetUserTaskStatus 获取任务状态
func GetUserTaskStatus(a *app.Gin) (ret []*values.OneTask) {
tasks := call.GetConfigTask()
for _, v := range tasks {
one := &values.OneTask{
ID: v.ID,
TaskID: v.TaskID,
Target: v.Target,
Reward: v.Reward,
Kind: v.Kind,
Type: int(v.Type),
Icon: v.Icon,
Title: common.GetTaskTitle(v),
Action: v.Action,
userTask := call.GetUserTaskData(a.UID)
taskCfgs := call.GetConfigTask()
taskMap := make(map[int]*common.ConfigTaskStr) // 任务列表
userTaskMap := make(map[int]*common.TaskData)
preTask := make(map[int]struct{})
var update bool
for _, v := range taskCfgs {
taskMap[v.TaskID] = &common.ConfigTaskStr{
ConfigTask: v,
}
if v.PreTaskId > 0 {
preTask[v.PreTaskId] = struct{}{}
}
// 非次数任务,需转换目标数值
// if !common.IsNumTaskType(v.Type) {
// one.Target /= common.DecimalDigits
// }
ret = append(ret, one)
}
if a.UID <= 0 {
return
for _, v := range userTask {
if _, ok := taskMap[v.TaskID]; !ok { // 不存在则删除
db.Mysql().C().Model(&common.TaskData{}).Where("id = ?", v.ID).Delete(&common.TaskData{})
update = true
continue
} else {
taskMap[v.TaskID].Exist = true
}
}
now := time.Now()
task := call.GetUserTaskData(a.UID)
for _, v := range ret {
for _, k := range task {
if v.TaskID == k.TaskID {
v.Progess = k.Progress
taskTime := time.Unix(k.Time, 0)
// 跨天清空数据
if !util.IsSameDay(now, taskTime) && v.Kind == common.TaskKindDayOne {
v.Status = 0
v.Progess = 0
err := db.Mysql().Update(&k, map[string]interface{}{
"progress": 0,
"time": now.Unix(),
})
if err != nil {
log.Error("GetUserTaskStatus err:%v", err)
}
}
break
for _, v := range taskMap {
if !v.Exist { // 不存在/失效的 则创建/更新
update = true
task := &common.TaskData{
UID: a.UID,
TaskID: v.TaskID,
TaskType: int(v.Type),
TargetValue: int(v.Target),
TaskValue: 0,
TaskStatus: 0,
EndAt: 0,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
if v.Type == int(common.TaskTypeDownload) && v.Progess != -1 { // 已下载直接标记为完成
if a.DeviceType == common.DeviceTypeWebview || a.DeviceType == common.DeviceTypePWA {
// 直接领取下载奖励
taskId := call.CheckTask(call.Task{Uid: a.UID, Value: 0, Types: []common.TaskType{common.TaskTypeDownload}})
TaskComplete(a, &DrawTaskReq{TaskID: taskId})
a.Code = values.CodeOK
a.Msg = ""
switch v.Cycle {
case 1:
task.EndAt = util.GetZeroTime(time.Now().AddDate(0, 0, 1)).Unix()
case 2:
task.EndAt = util.GetWeekZeroTime(time.Now().AddDate(0, 0, 7)).Unix()
case 3:
task.EndAt = util.GetFirstDateOfMonth(time.Now().AddDate(0, 1, 0)).Unix()
case 4:
task.EndAt = -1
}
err := db.Mysql().C().Model(&common.TaskData{}).Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "uid"}, {Name: "task_id"}},
DoUpdates: clause.Assignments(map[string]interface{}{
"task_type": task.TaskType,
"task_value": task.TaskValue,
"target_value": task.TargetValue,
"task_status": task.TaskStatus,
"end_at": task.EndAt,
"updated_at": task.UpdatedAt,
}),
}).Create(task).Error
if err != nil {
log.Error("create task err, %s", err.Error())
continue
}
}
}
if update {
userTask = call.GetUserTaskData(a.UID)
}
for _, v := range userTask {
userTaskMap[v.TaskID] = v
}
ret = make([]*values.OneTask, 0, len(userTask))
for _, v := range userTask {
if taskMap[v.TaskID].PreTaskId > 0 && userTaskMap[taskMap[v.TaskID].PreTaskId].TaskStatus != 2 {
continue
}
if _, ok := preTask[v.TaskID]; ok && v.TaskStatus == 2 {
continue
}
if v.TaskStatus == 2 {
continue
}
// 非次数任务,需转换目标数值
// if !common.IsNumTaskType(v.Type) && v.Progess > 0 {
// v.Progess /= common.DecimalDigits
// }
if v.Progess < 0 {
v.Progess = v.Target
v.Status = 2
} else if v.Progess >= v.Target {
v.Progess = v.Target
v.Status = 1
oneTask := &values.OneTask{
TaskID: v.TaskID,
Progress: int64(v.TaskValue),
Target: taskMap[v.TaskID].Target,
Reward: taskMap[v.TaskID].Reward,
Cycle: taskMap[v.TaskID].Cycle,
TaskType: int(taskMap[v.TaskID].Type),
Status: v.TaskStatus,
Title: taskMap[v.TaskID].Title,
Url: taskMap[v.TaskID].Url,
Sort: taskMap[v.TaskID].Sort,
Expand: taskMap[v.TaskID].Expand,
}
if oneTask.Progress >= oneTask.Target && oneTask.Status != 2 {
oneTask.Status = 1
}
ret = append(ret, oneTask)
}
sort.SliceStable(ret, func(i, j int) bool {
return ret[i].Status > ret[j].Status
return ret[i].Sort > ret[j].Sort
})
return
}
@ -104,15 +143,6 @@ func GetPromotions(c *gin.Context) {
a.GetUID()
ret.ActivityList = call.GetConfigActivityActiveAll(a.UID)
ret.TaskList = GetUserTaskStatus(a)
num := 0
for _, task := range ret.TaskList {
if task.Status == 1 {
num++
}
}
if num > 0 {
//call.PushRed(a.UID, pb.RedPointModule_RedPointTask, uint32(num))
}
}
func UploadActivityData(c *gin.Context) {

@ -98,5 +98,5 @@ func H5DownloadDraw(c *gin.Context) {
// Event: common.CurrencyEventH5Download,
// },
// }, true, true)
call.CheckTask(call.Task{Uid: a.UID, Value: 0, Types: []common.TaskType{common.TaskTypeDownload}})
call.CheckTask(call.Task{Uid: a.UID, Value: 1, Types: []common.TaskType{common.TaskTypeDownload}})
}

@ -24,14 +24,14 @@ func LuckyWheelCfg(c *gin.Context) {
return
}
uid := a.UID
if !db.Redis().Lock(common.GetRedisKeyLuckyWheel(uid)) {
a.Code = values.CodeRetry
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyLuckyWheel(uid))
}()
call.CheckLuckyWheel(uid, true)
//if !db.Redis().Lock(common.GetRedisKeyLuckyWheel(uid)) {
// a.Code = values.CodeRetry
// return
//}
//defer func() {
// db.Redis().UnLock(common.GetRedisKeyLuckyWheel(uid))
//}()
resp := &values.LuckyWheelCfgResp{}
a.Data = resp
@ -41,12 +41,12 @@ func LuckyWheelCfg(c *gin.Context) {
}
rechargeInfo := call.GetRechargeInfo(uid)
playerData := call.GetPlayerData(uid)
if rechargeInfo.TotalRechargeCount <= int64(luckyWheel.RechargeCount) {
if rechargeInfo.TotalRechargeCount < int64(luckyWheel.RechargeCount) {
return
}
var (
update bool
)
//var (
// update bool
//)
for _, wheelCfg := range luckyWheel.WheelCfgStr {
//if wheelCfg.LuckyType == 4 &&
// rechargeInfo.TotalRecharge < int64(wheelCfg.RechargeAmount[0]*common.DecimalDigits) { // 特殊转盘达到了才能看见
@ -57,35 +57,35 @@ func LuckyWheelCfg(c *gin.Context) {
if rechargeAmount == 0 {
continue
}
freeKey := fmt.Sprintf("f%d_%d", wheelCfg.LuckyType, rechargeAmount)
if rechargeInfo.TotalRecharge >= int64(rechargeAmount)*common.DecimalDigits &&
playerData.LuckyWheelMap[freeKey] == 0 {
playerData.LuckyWheelMap[freeKey] = 1
playerData.LuckyWheelMap[lessKey] += 1
update = true
}
//freeKey := fmt.Sprintf("f%d_%d", wheelCfg.LuckyType, rechargeAmount)
//if rechargeInfo.TotalRecharge >= int64(rechargeAmount)*common.DecimalDigits &&
// playerData.LuckyWheelMap[freeKey] == 0 {
// playerData.LuckyWheelMap[freeKey] = 1
// playerData.LuckyWheelMap[lessKey] += 1
// update = true
//}
}
resp.LuckyWheel = append(resp.LuckyWheel, values.LuckyWheel{
LuckyWheel: wheelCfg,
LessDrawCount: playerData.LuckyWheelMap[lessKey],
})
}
if update {
luckyWheelBytes, err := json.Marshal(playerData.LuckyWheelMap)
if err != nil {
log.Error("marshal err, %s", err.Error())
a.Code = values.CodeRetry
return
}
err = db.Mysql().C().Model(&common.PlayerData{}).Where("uid = ?", uid).Updates(map[string]interface{}{
"lucky_wheel": string(luckyWheelBytes),
}).Error
if err != nil {
log.Error("update err, %s", err.Error())
a.Code = values.CodeRetry
return
}
}
//if update {
// luckyWheelBytes, err := json.Marshal(playerData.LuckyWheelMap)
// if err != nil {
// log.Error("marshal err, %s", err.Error())
// a.Code = values.CodeRetry
// return
// }
// err = db.Mysql().C().Model(&common.PlayerData{}).Where("uid = ?", uid).Updates(map[string]interface{}{
// "lucky_wheel": string(luckyWheelBytes),
// }).Error
// if err != nil {
// log.Error("update err, %s", err.Error())
// a.Code = values.CodeRetry
// return
// }
//}
a.Data = resp
}

@ -8,6 +8,7 @@ import (
"server/db"
"server/modules/web/app"
"server/modules/web/values"
"time"
)
// Record 领奖进度,key为taskid,value为任务进度,小与0时表示已领取
@ -26,53 +27,69 @@ func GetTaskInfo(c *gin.Context) {
num := 0
for _, task := range resp.TaskList {
if task.Status == 1 {
//log.Debug("uid:%d task:%+v", a.UID, *task)
num++
}
}
if num > 0 {
//call.PushRed(a.UID, pb.RedPointModule_RedPointTask, uint32(num))
}
//if num > 0 {
// call.PushRed(a.UID, pb.RedPointModule_RedPointTaskDraw, uint32(num))
//}
}
type DrawTaskReq struct {
TaskID int
}
func TaskComplete(a *app.Gin, req *DrawTaskReq) {
type DrawTaskResp struct {
TaskID int
Award int64
}
func TaskComplete(a *app.Gin, req *DrawTaskReq) (reward int64) {
if !db.Redis().Lock(common.GetRedisKeyTask(a.UID)) {
a.Code = values.CodeRetry
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyTask(a.UID))
}()
con := call.GetConfigTaskByTaskID(req.TaskID)
if con == nil {
a.Code = values.CodeRetry
return
}
task := call.GetUserTaskDataByTaskID(a.UID, req.TaskID)
if task.Progress < con.Target {
a.Code = values.CodeParam
a.Msg = "Task not complete."
task, err := call.GetUserTaskDataByTaskID(a.UID, req.TaskID)
if err != nil {
log.Error("get task data err, %s ", err.Error())
a.Code = values.CodeRetry
return
}
var rows int64
var err error
if con.Kind == common.TaskKindOnce || con.Kind == common.TaskKindDayOne {
rows, err = db.Mysql().UpdateRes(&common.TaskData{UID: a.UID, TaskID: req.TaskID, Progress: task.Progress}, map[string]interface{}{"progress": -1})
} else if con.Kind == common.TaskKindCycle {
rows, err = db.Mysql().UpdateRes(&common.TaskData{UID: a.UID, TaskID: req.TaskID, Progress: task.Progress}, map[string]interface{}{"progress": 0})
}
if err != nil {
log.Error("err:%v", err)
if task.ID == 0 {
a.Code = values.CodeRetry
return
}
if rows == 0 {
if task.TaskValue < int(con.Target) {
a.Code = values.CodeParam
a.Msg = "Task not complete."
return
}
err = db.Mysql().Update(&common.TaskData{ID: task.ID}, map[string]interface{}{
"task_status": 2,
"updated_at": time.Now(),
})
if err != nil {
log.Error("update task status err, %s", err.Error())
a.Code = values.CodeRetry
return
}
if con.Reward <= 0 {
reward = con.Reward
if reward == 0 {
return
}
_, err = call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: a.UID,
Value: con.Reward,
Value: reward,
Event: common.CurrencyEventTask,
Type: common.CurrencyINR,
Exi1: req.TaskID,
@ -83,6 +100,7 @@ func TaskComplete(a *app.Gin, req *DrawTaskReq) {
a.Code = values.CodeRetry
return
}
return
}
func DrawTask(c *gin.Context) {
@ -94,13 +112,29 @@ func DrawTask(c *gin.Context) {
if !a.S(req) {
return
}
TaskComplete(a, req)
a.Data = req
num := 0
for _, task := range GetUserTaskStatus(a) {
if task.Status == 1 {
num++
}
resp := &DrawTaskResp{
TaskID: req.TaskID,
Award: TaskComplete(a, req),
}
//call.PushRed(a.UID, pb.RedPointModule_RedPointTask, uint32(num))
a.Data = resp
}
type JoinChannelReq struct {
}
func JoinChannel(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := &JoinChannelReq{}
if !a.S(req) {
return
}
uid := a.UID
call.CheckTask(call.Task{
Uid: uid,
Value: 1,
Types: []common.TaskType{common.TaskTypeJoinChannel},
})
}

@ -9,6 +9,7 @@ import (
"server/db"
"server/modules/web/app"
"server/modules/web/values"
"server/pb"
"server/util"
"time"
@ -364,31 +365,41 @@ func newContext(c *gin.Context) *gin.Context {
// CheckTask 完成任务
func CheckTask(a *app.Gin) {
var taskList []*values.OneTask
tasks := call.GetConfigTask()
for _, v := range tasks {
one := &values.OneTask{
ID: v.ID,
TaskID: v.TaskID,
Target: v.Target,
Reward: v.Reward,
Kind: v.Kind,
Type: int(v.Type),
Icon: v.Icon,
Title: common.GetTaskTitle(v),
Action: v.Action,
}
taskList = append(taskList, one)
}
for _, v := range taskList {
if v.Type == int(common.TaskTypeDownload) && v.Progess != -1 { // 已下载直接标记为完成
if a.DeviceType == common.DeviceTypeWebview || a.DeviceType == common.DeviceTypePWA {
// 直接领取下载奖励
taskId := call.CheckTask(call.Task{Uid: a.UID, Value: 0, Types: []common.TaskType{common.TaskTypeDownload}})
TaskComplete(a, &DrawTaskReq{TaskID: taskId})
}
taskList := GetUserTaskStatus(a)
num := 0
for _, task := range taskList {
if task.Status == 1 {
num++
}
}
if num > 0 {
call.PushRed(a.UID, pb.RedPointModule_RedPointTaskDraw, uint32(num))
}
//var taskList []*values.OneTask
//tasks := call.GetConfigTask()
//for _, v := range tasks {
// one := &values.OneTask{
// ID: v.ID,
// TaskID: v.TaskID,
// Target: v.Target,
// Reward: v.Reward,
// Kind: v.Kind,
// Type: int(v.Type),
// Icon: v.Icon,
// Title: common.GetTaskTitle(v),
// Action: v.Action,
// }
// taskList = append(taskList, one)
//}
//for _, v := range taskList {
// if v.Type == int(common.TaskTypeDownload) && v.Progess != -1 { // 已下载直接标记为完成
// if a.DeviceType == common.DeviceTypeWebview || a.DeviceType == common.DeviceTypePWA {
// // 直接领取下载奖励
// taskId := call.CheckTask(call.Task{Uid: a.UID, Value: 0, Types: []common.TaskType{common.TaskTypeDownload}})
// TaskComplete(a, &DrawTaskReq{TaskID: taskId})
// }
// }
//}
}
func CheckRedPoint(uid int, c *gin.Context) {
// 防止玩家未连接网关,所以延迟3秒

@ -3,7 +3,9 @@ package sn
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/go-redis/redis/v8"
"io/ioutil"
"server/call"
"server/common"
@ -185,6 +187,10 @@ func GameBet(c *gin.Context) {
resp.Msg = "success"
log.Debug("sn gameBetResp, %s:%+v", account, resp)
a.Data = resp
go func() {
defer util.Recover()
checkControl(uid)
}()
}
func Settle(c *gin.Context) {
@ -602,7 +608,7 @@ func GameControlCallback(c *gin.Context) {
return
}
defer func() {
err = Control(uid, util.ToInt(req.ControlId))
err = Control(uid, util.ToInt(req.ControlId), "", 0)
if err != nil {
log.Error("sn control err, %s", err.Error())
}
@ -627,21 +633,78 @@ func checkSpecialControl(result string) bool {
const specialControlRtp = 85
func Control(uid int, controlId int) error {
if controlId == 0 {
controlId = 1
func checkControl(uid int) {
result, err := db.Redis().GetRedis().Get(context.Background(), fmt.Sprintf("player:%v:sn:status", uid)).Result()
if err != nil {
if errors.Is(err, redis.Nil) {
return
}
log.Error("get user sn status err, %s", err.Error())
return
}
if result == "" {
log.Error("get user sn status is nil, %d", uid)
return
}
//log.Debug("sn control update, uid:%d status:%s", uid, result)
controlInfos := strings.Split(result, "|")
rtp := util.ToInt(controlInfos[0])
templateId := controlInfos[1]
rtpNow := getControlRtp(uid)
totalRecharge, defaultValue, templateIdNow := getControlTemplate(uid)
var update bool
if templateId != "" && templateId != templateIdNow { // 直接更新
update = true
}
if templateId == "" && rtp != rtpNow {
update = true
}
if update {
log.Debug("sn control update, uid:%d old info:%d|%s new info:%d|%s(%d|%d)", uid, rtp, templateId, rtpNow, templateIdNow, totalRecharge, defaultValue)
Control(uid, 0, templateIdNow, rtpNow)
}
}
func getControlRtp(uid int) int {
rtp := call.GetRtpControlV1(uid)
result, _ := db.Redis().GetRedis().Get(context.Background(), fmt.Sprintf("player:%v:games:at", uid)).Result()
if rtp > specialControlRtp && checkSpecialControl(result) {
rtp = specialControlRtp
log.Debug("rtpControl special, uid:%d result:%s, rtp:%d", uid, result, specialControlRtp)
}
return rtp
}
func getControlTemplate(uid int) (int64, int, string) {
templateId := call.GetConfigRtpTemplateId()
if templateId == "" && DefaultTemplateId != "" {
log.Debug("sn cfg templateId is nil")
templateId = DefaultTemplateId
}
defaultTemplateRecharge := 300 * common.DecimalDigits
userInfo, _ := call.GetUserInfo(uid)
channelInfo := call.GetChannelByID(userInfo.ChannelID)
if channelInfo.TemplateRecharge > 0 {
defaultTemplateRecharge = channelInfo.TemplateRecharge
}
rechargeInfo := call.GetRechargeInfo(uid)
if rechargeInfo.TotalRecharge >= int64(defaultTemplateRecharge) {
templateId = ""
}
//log.Debug("sn control template, uid:%d %d|%d %s", uid, rechargeInfo.TotalRecharge, defaultTemplateRecharge, templateId)
return rechargeInfo.TotalRecharge, defaultTemplateRecharge, templateId
}
func Control(uid int, controlId int, templateId string, rtp int) error {
if controlId == 0 {
controlId = 1
}
var totalRecharge int64
var defaultValue int
if rtp == 0 && templateId == "" {
rtp = getControlRtp(uid)
totalRecharge, defaultValue, templateId = getControlTemplate(uid)
}
req := &ControlReq{
BaseReq: BaseReq{
SnAccount: SnAccount,
@ -661,18 +724,7 @@ func Control(uid int, controlId int) error {
},
}
defaultTemplateRecharge := 300 * common.DecimalDigits
userInfo, _ := call.GetUserInfo(uid)
channelInfo := call.GetChannelByID(userInfo.ChannelID)
if channelInfo.TemplateRecharge > 0 {
defaultTemplateRecharge = channelInfo.TemplateRecharge
}
rechargeInfo := call.GetRechargeInfo(uid)
if rechargeInfo.TotalRecharge >= int64(defaultTemplateRecharge) {
req.TemplateId = ""
}
log.Debug("sn control req, %+v", *req)
log.Debug("sn control req, %+v templateInfo(%d|%d)", *req, totalRecharge, defaultValue)
reqBody, _ := json.Marshal(req)
var tmpValue map[string]interface{}
json.Unmarshal(reqBody, &tmpValue)
@ -685,10 +737,13 @@ func Control(uid int, controlId int) error {
return err
}
if resp.Code != CodeRequestSuccess && resp.Code != CodeRequestExist {
log.Error("control err, %+v", resp)
return fmt.Errorf("control err, %+v ", resp)
log.Error("sn control err, %+v", resp)
return fmt.Errorf("sn control err, %+v ", resp)
}
err = db.Redis().GetRedis().Set(context.Background(), fmt.Sprintf("player:%v:sn:status", uid), fmt.Sprintf("%d|%s", rtp, templateId), 0).Err()
if err != nil {
log.Error("sn control, set user sn status err, %s", err.Error())
}
return nil
}

@ -9,4 +9,5 @@ import (
func task(e *gin.RouterGroup) {
e.POST("/task/info", handler.GetTaskInfo)
e.POST("/task/draw", handler.DrawTask)
e.POST("/task/joinChannel", handler.JoinChannel)
}

@ -1,19 +1,15 @@
package values
// Kind 1单次 2循环
// Type 1注册 2下载 3累充 4单次充
// Progess 进度
// Status 0未完成 1已完成 2已领取
type OneTask struct {
ID int
TaskID int
Target int64
Reward int64
Kind int
Type int
Progess int64
Status int
Title string
Icon string
Action int
TaskID int // 任务id
Progress int64 // 进度
Target int64 // 任务值
Reward int64 // 奖励数值
Cycle int // 周期(1每日 2每周 3每月 4单次)
TaskType int // 任务类型(1:邀请玩家注册,2:充值次数,3:下注额,4:解锁周卡,5:订阅频道)
Status int // 0未完成,1已完成,2已领取
Title string // 标题
Url string // 跳转链接
Sort int // 排序
Expand string // 扩展信息
}

@ -72,6 +72,8 @@ enum RedPointModule{
RedPointCashBack = 7; //
RedPointPdd = 8; // pdd次数
RedPointMailPersonal = 9; // -
RedPointTaskDraw = 10; //
RedPointLuckyWheel = 11; //
}
message RedInfo {

Loading…
Cancel
Save