diff --git a/call/luckyWheel.go b/call/luckyWheel.go index 80e89fd..977c598 100644 --- a/call/luckyWheel.go +++ b/call/luckyWheel.go @@ -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) + } +} diff --git a/call/pay.go b/call/pay.go index ea7158a..486ec0f 100644 --- a/call/pay.go +++ b/call/pay.go @@ -582,6 +582,8 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI UpdateVip(r.UID, r.Amount, 0, 0) // 检查任务 CheckTask(Task{r.UID, 1, []common.TaskType{common.TaskTypeRecharge}}) + // 检测转盘 + CheckLuckyWheel(r.UID) // 检查所有活动 CheckAllActivity(r) diff --git a/call/pdd.go b/call/pdd.go index a23cf0e..5e0163c 100644 --- a/call/pdd.go +++ b/call/pdd.go @@ -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)) + } +} diff --git a/call/task.go b/call/task.go index 84ec3b3..8f3b03b 100644 --- a/call/task.go +++ b/call/task.go @@ -3,6 +3,7 @@ package call import ( "server/common" "server/db" + "server/pb" "time" "github.com/liangdas/mqant/log" @@ -16,9 +17,25 @@ type Task struct { Types []common.TaskType // 任务类型 } -func CheckTask(task Task) (taskId int) { - log.Info("checkTask task:%v", task) +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()). @@ -30,5 +47,6 @@ func CheckTask(task Task) (taskId int) { continue } } + push() return } diff --git a/common/task.go b/common/task.go index 1be0598..cfd39be 100644 --- a/common/task.go +++ b/common/task.go @@ -83,15 +83,16 @@ func (c *ConfigTask) TableName() string { } type TaskData struct { - 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"` // 任务值 - 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"` // 更新时间 + 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 { diff --git a/modules/hall/player.go b/modules/hall/player.go index aaab20e..e74b93e 100644 --- a/modules/hall/player.go +++ b/modules/hall/player.go @@ -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) diff --git a/modules/web/handler/activity.go b/modules/web/handler/activity.go index dd156f1..77fb66c 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -51,14 +51,15 @@ func GetUserTaskStatus(a *app.Gin) (ret []*values.OneTask) { if !v.Exist { // 不存在/失效的 则创建/更新 update = true task := &common.TaskData{ - UID: a.UID, - TaskID: v.TaskID, - TaskType: int(v.Type), - TaskValue: 0, - TaskStatus: 0, - EndAt: 0, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), + 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(), } switch v.Cycle { case 1: @@ -73,11 +74,12 @@ func GetUserTaskStatus(a *app.Gin) (ret []*values.OneTask) { 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, - "task_status": task.TaskStatus, - "end_at": task.EndAt, - "updated_at": task.UpdatedAt, + "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 { @@ -141,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) { diff --git a/modules/web/handler/luckyWheel.go b/modules/web/handler/luckyWheel.go index 849b0b0..ee0ff9d 100644 --- a/modules/web/handler/luckyWheel.go +++ b/modules/web/handler/luckyWheel.go @@ -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 @@ -44,9 +44,9 @@ func LuckyWheelCfg(c *gin.Context) { 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 } diff --git a/modules/web/handler/task.go b/modules/web/handler/task.go index 9e9f378..dea8790 100644 --- a/modules/web/handler/task.go +++ b/modules/web/handler/task.go @@ -8,7 +8,6 @@ import ( "server/db" "server/modules/web/app" "server/modules/web/values" - "server/pb" "time" ) @@ -28,12 +27,13 @@ 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_RedPointTaskDraw, uint32(num)) - } + //if num > 0 { + // call.PushRed(a.UID, pb.RedPointModule_RedPointTaskDraw, uint32(num)) + //} } type DrawTaskReq struct { @@ -117,13 +117,6 @@ func DrawTask(c *gin.Context) { Award: TaskComplete(a, req), } a.Data = resp - num := 0 - for _, task := range GetUserTaskStatus(a) { - if task.Status == 1 { - num++ - } - } - call.PushRed(a.UID, pb.RedPointModule_RedPointTaskDraw, uint32(num)) } type JoinChannelReq struct { diff --git a/modules/web/handler/user.go b/modules/web/handler/user.go index f07c35e..37e3721 100644 --- a/modules/web/handler/user.go +++ b/modules/web/handler/user.go @@ -9,6 +9,7 @@ import ( "server/db" "server/modules/web/app" "server/modules/web/values" + "server/pb" "server/util" "time" @@ -364,7 +365,16 @@ func newContext(c *gin.Context) *gin.Context { // CheckTask 完成任务 func CheckTask(a *app.Gin) { - GetUserTaskStatus(a) + 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 { diff --git a/pb/proto/platform.proto b/pb/proto/platform.proto index 05e0ab9..00c4acd 100644 --- a/pb/proto/platform.proto +++ b/pb/proto/platform.proto @@ -73,6 +73,7 @@ enum RedPointModule{ RedPointPdd = 8; // pdd次数 RedPointMailPersonal = 9; // 邮件-个人 RedPointTaskDraw = 10; // 任务奖励 + RedPointLuckyWheel = 11; // 转盘 } message RedInfo {