diff --git a/call/activity.go b/call/activity.go index b547c87..2f9b333 100644 --- a/call/activity.go +++ b/call/activity.go @@ -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 diff --git a/call/config.go b/call/config.go index 2fcdc2f..127fcb8 100644 --- a/call/config.go +++ b/call/config.go @@ -1384,6 +1384,9 @@ func LoadConfigTask() (err error) { } func GetConfigTask() []*common.ConfigTask { + if len(configTask) == 0 { + LoadConfigTask() + } return configTask } 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 d47b957..486ec0f 100644 --- a/call/pay.go +++ b/call/pay.go @@ -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: 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/share.go b/call/share.go index f4d3779..2c76d5b 100644 --- a/call/share.go +++ b/call/share.go @@ -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}}) } }) } diff --git a/call/task.go b/call/task.go index 3143a5c..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" @@ -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 } diff --git a/call/user.go b/call/user.go index b228558..3468d3e 100644 --- a/call/user.go +++ b/call/user.go @@ -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) { diff --git a/common/redis_keys.go b/common/redis_keys.go index 68f8242..f77433f 100644 --- a/common/redis_keys.go +++ b/common/redis_keys.go @@ -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) +} diff --git a/common/task.go b/common/task.go index be24cab..cfd39be 100644 --- a/common/task.go +++ b/common/task.go @@ -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 { diff --git a/modules/backend/handler/firstpage.go b/modules/backend/handler/firstpage.go index c4d5687..c010235 100644 --- a/modules/backend/handler/firstpage.go +++ b/modules/backend/handler/firstpage.go @@ -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...) diff --git a/modules/backend/handler/guser/getGameUserRechargeHistory.go b/modules/backend/handler/guser/getGameUserRechargeHistory.go index f51c35c..d804222 100644 --- a/modules/backend/handler/guser/getGameUserRechargeHistory.go +++ b/modules/backend/handler/guser/getGameUserRechargeHistory.go @@ -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, diff --git a/modules/backend/models/db.go b/modules/backend/models/db.go index a946863..1ac845a 100644 --- a/modules/backend/models/db.go +++ b/modules/backend/models/db.go @@ -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() 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 491529f..77fb66c 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -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) { diff --git a/modules/web/handler/h5.go b/modules/web/handler/h5.go index 0fb9c5e..10c9bc7 100644 --- a/modules/web/handler/h5.go +++ b/modules/web/handler/h5.go @@ -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}}) } diff --git a/modules/web/handler/luckyWheel.go b/modules/web/handler/luckyWheel.go index fce37f3..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 @@ -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 } diff --git a/modules/web/handler/task.go b/modules/web/handler/task.go index 9452106..dea8790 100644 --- a/modules/web/handler/task.go +++ b/modules/web/handler/task.go @@ -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}, + }) } diff --git a/modules/web/handler/user.go b/modules/web/handler/user.go index d2689c0..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,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秒 diff --git a/modules/web/routers/routers_task.go b/modules/web/routers/routers_task.go index 7a02730..25ff1f6 100644 --- a/modules/web/routers/routers_task.go +++ b/modules/web/routers/routers_task.go @@ -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) } diff --git a/modules/web/values/task.go b/modules/web/values/task.go index 6a67c33..5016eaa 100644 --- a/modules/web/values/task.go +++ b/modules/web/values/task.go @@ -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 // 扩展信息 } diff --git a/pb/proto/platform.proto b/pb/proto/platform.proto index 822f313..00c4acd 100644 --- a/pb/proto/platform.proto +++ b/pb/proto/platform.proto @@ -72,6 +72,8 @@ enum RedPointModule{ RedPointCashBack = 7; // 返现 RedPointPdd = 8; // pdd次数 RedPointMailPersonal = 9; // 邮件-个人 + RedPointTaskDraw = 10; // 任务奖励 + RedPointLuckyWheel = 11; // 转盘 } message RedInfo {