package handler import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" "gorm.io/gorm" "server/call" "server/common" "server/config" "server/db" "server/modules/web/app" "server/modules/web/values" "server/util" "time" ) // 分享新手任务[done] func ShareNewTaskInfo(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() resp := &values.ShareNewTaskInfoResp{} a.Data = resp list := []common.ShareTaskNewData{} db.Mysql().QueryAll(fmt.Sprintf("uid = %d", a.UID), "", &common.ShareTaskNewData{}, &list) for _, v := range list { one := values.OneShareNewTask{ TaskID: v.TaskID, Desc: v.GetDesc(), Type: v.Type, Progess: v.Progress, Target: v.Target, Reward: v.Reward, } if one.Progess >= one.Target || v.Status == 1 { one.Progess = one.Target if v.Status == 1 { one.Status = 2 } else { one.Status = 1 } } resp.TaskList = append(resp.TaskList, one) } } // 新手任务领取[done] func ShareNewTaskDraw(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareNewTaskDrawReq) if !a.S(req) { return } resp := &values.ShareNewTaskDrawResp{} a.Data = resp task := &common.ShareTaskNewData{UID: a.UID, TaskID: req.TaskID} db.Mysql().Get(task) if task.ID == 0 || task.Progress < task.Target { a.Code = values.CodeParam a.Msg = "Task not completed." return } if task.Status == 1 { a.Code = values.CodeParam a.Msg = "Task received." return } rows, err := db.Mysql().UpdateWRes(&common.ShareTaskNewData{}, map[string]interface{}{"status": 1}, fmt.Sprintf("uid = %d and task_id = %d and status = 0", a.UID, req.TaskID)) if rows == 0 || err != nil { a.Code = values.CodeRetry return } call.UpdateShare(a.UID, 3, task.Reward, fmt.Sprintf("%d", task.Target)) resp.Reward = task.Reward } func ShareNewAffiliate(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareNewAffiliateReq) if !a.S(req) { return } if req.Num > 50 { req.Num = 50 } resp := &values.ShareNewAffiliateResp{} a.Data = resp si := &common.ShareInfo{UID: a.UID} db.Mysql().Get(si) if si.ID == 0 { return } resp.Level1 = si.Down1 resp.Level2 = si.Down2 resp.Level3 = si.Down3 resp.Level4 = si.Down4 resp.Level5 = si.Down5 list := []common.ShareInfo{} sql := fmt.Sprintf("up1 = %d", a.UID) if req.Level > 0 { sql = fmt.Sprintf("up%d = %d", req.Level, a.UID) } resp.Count, _ = db.Mysql().QueryList(req.Page, req.Num, sql, "down1 desc", &common.ShareInfo{}, &list) for _, v := range list { one := values.OneShareNewAffiliate{UID: v.UID, AffiliateCount: v.Down1} p, _ := call.GetUserXInfo(v.UID, "nick", "last_login") one.Nick = p.Nick one.LastLogin = p.LastLogin resp.AffiliateList = append(resp.AffiliateList, one) } } // 收益列表 func ShareNewCommission(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareNewCommissionReq) if !a.S(req) { return } resp := &values.ShareNewCommissionResp{Count: 100, List: []values.OneShareNewCommission{}} a.Data = resp total := &common.ShareRewardData{UID: a.UID} db.Mysql().QueryBySql(fmt.Sprintf("select * from share_reward_data where uid = %d and time = 0", a.UID), total) resp.All = total.TotalReward resp.Invitation = total.InviteReward resp.Affiliate = total.AffiliateReward resp.Recharge = total.RechargeReward resp.Other = total.OtherReward if req.Num*req.Page >= 100 { return } list := []common.ShareRewardData{} db.Mysql().QueryList(0, 100, fmt.Sprintf("uid = %d", a.UID), "time desc", &common.ShareRewardData{}, &list) now := time.Now() zero := util.GetZeroTime(now) if req.Page > 0 { zero = zero.AddDate(0, 0, -req.Page*req.Num) } for i := 0; i < req.Num; i++ { one := values.OneShareNewCommission{Date: zero.Format("20060102")} for _, v := range list { if v.Date == one.Date { one.Invitation = v.InviteReward one.Recharge = v.RechargeReward one.Affiliate = v.AffiliateReward one.Other = v.OtherReward break } } resp.List = append(resp.List, one) zero = zero.AddDate(0, 0, -1) } } // 排行榜 func ShareNewRank(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareNewRankReq) if !a.S(req) { return } resp := &values.ShareNewRankResp{ List: []*common.ShareRank{}, } a.Data = resp now := time.Now() dayNow := now for i := 0; i < 7; i++ { resp.Days = append(resp.Days, dayNow.Format("01/02")) dayNow = dayNow.AddDate(0, 0, -1) } weekNow := util.GetWeekZeroTime(now) for i := 0; i < 4; i++ { resp.Weeks = append(resp.Weeks, fmt.Sprintf("%s-%s", weekNow.Format("01/02"), weekNow.AddDate(0, 0, 7).Format("01/02"))) weekNow = weekNow.AddDate(0, 0, -7) } monthNow := util.GetFirstDateOfMonth(now) for i := 0; i < 3; i++ { resp.Months = append(resp.Months, fmt.Sprintf("%s-%s", monthNow.Format("01/02"), monthNow.AddDate(0, 1, 0).Format("01/02"))) monthNow = monthNow.AddDate(0, -1, 0) } var list []*common.ShareRank resp.Self = &common.ShareRank{ UID: a.UID, Type: req.Type, Rank: -1, } if req.Time == 0 { resp.Self.Time = time.Now().Unix() switch req.Type { case common.ShareRankTypeDaily: list = values.ShareRankDaily case common.ShareRankTypeWeekly: list = values.ShareRankWeekly case common.ShareRankTypeMonthly: list = values.ShareRankMonthly } } else { var ti int64 switch req.Type { case common.ShareRankTypeDaily: ti = util.GetZeroTime(now.AddDate(0, 0, -req.Time)).Unix() case common.ShareRankTypeWeekly: ti = util.GetWeekZeroTime(now.AddDate(0, 0, -req.Time*7)).Unix() case common.ShareRankTypeMonthly: ti = util.GetFirstDateOfMonth(now.AddDate(0, -req.Time, 0)).Unix() } resp.Self.Time = ti list = call.GetShareRank(req.Type, ti) } for i, v := range list { v.Rank = i + 1 if v.UID == a.UID { resp.Self = v } } if resp.Self.Rank == -1 { resp.Self = call.GetShareRewardData(a.UID, req.Type, resp.Self.Time) resp.Self.Rank = -1 } start := req.Page * req.Num if start > common.ShareRankMaxNum { return } if start > len(list) { return } end := start + req.Num if end > common.ShareRankMaxNum { end = common.ShareRankMaxNum } if end > len(list) { end = len(list) } resp.List = list[start:end] } func ShareNewBroadcast(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() // req := new(values.ShareNewBroadcastReq) // if !a.S(req) { // return // } // if req.Num > 100 { // req.Num = 100 // } resp := &values.ShareNewBroadcastResp{List: values.ShareWithdrawBroadcast} a.Data = resp } func ShareNewWithdrawInfo(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() resp := &values.ShareNewWithdrawInfoResp{Tips: call.GetConfigPlatform().WithdrawTips} a.Data = resp si := call.GetShareInfo(a.UID) resp.TotalBalance = si.Reward resp.Withdrawable = si.Withdrawable list := call.GetConfigWithdrawProduct(common.WithdrawSorceShare) db.Mysql().QueryList(0, 3, fmt.Sprintf("uid = %d and draw_type = '%s'", a.UID, common.WithdrawTypeBank), "id desc", &common.PayInfo{}, &resp.Accounts) sw := call.GetShareWithdrawInfo(a.UID) resp.WithDrawCount = sw.DayCount for _, v := range list { // todo one := &values.WithdrawProduct{ID: v.ProductID, Amount: v.Amount} resp.List = append(resp.List, one) } con := call.GetConfigShare(si.Level, a.Channel) if con == nil { a.Code = values.CodeRetry return } resp.TotalWithdrawCount = con.DayWithdrawCount channels := call.GetConfigWithdrawChannels() if len(channels) > 0 { resp.NewList = []*common.ConfigWithdrawChannels{channels[0]} } else { resp.NewList = []*common.ConfigWithdrawChannels{} } } func ShareNewWithdraw(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.WithdrawReq) if !a.S(req) { return } if req.CurrencyType != common.CurrencyINR { req.CurrencyType = common.CurrencyINR } one := call.GetConfigWithdrawProductByID(req.AmountID) if one == nil { a.Code = values.CodeParam a.Msg = "Withdraw product not found." return } uid := a.UID log.Debug("player %v withdraw %+v,one:%+v", uid, *req, *one) amount := one.Amount * 100 si := call.GetShareInfo(uid) if si.Withdrawable < amount { a.Code = values.CodeParam a.Msg = "Insufficient balance." return } con := call.GetConfigShare(si.Level, a.Channel) if con == nil { a.Code = values.CodeRetry return } sw := call.GetShareWithdrawInfo(uid) if sw.DayCount >= con.DayWithdrawCount { a.Code = values.CodeParam a.Msg = "Withdrawal limit." return } // 到游戏账户 if req.Type == 1 { tx := db.Mysql().Begin() defer a.MCommit(tx) // 更新余额 res := tx.Model(&common.ShareInfo{}).Where("uid = ? and reward >= ? and withdrawable >= ?", uid, amount, amount). Updates(map[string]interface{}{ "reward": gorm.Expr("reward - ?", amount), "withdrawable": gorm.Expr("withdrawable - ?", amount), }) if res.RowsAffected == 0 || res.Error != nil { log.Error("err:%v", res.Error) a.Code = values.CodeRetry return } // 更新次数 res = tx.Model(&common.ShareWithdrawInfo{}).Where("uid = ? and day_time = ?", uid, sw.DayTime). Updates(map[string]interface{}{"day_count": sw.DayCount + 1, "day_time": time.Now().Unix(), "total_withdraw": gorm.Expr("total_withdraw + ?", one.Amount)}) if res.RowsAffected == 0 || res.Error != nil { log.Error("err:%v", res.Error) a.Code = values.CodeRetry return } // 更新rechargeinfo,转移到游戏等同于充值 re := call.GetRechargeInfo(uid) if re.ID == 0 { res = tx.Model(&common.RechargeInfo{}).Create(&common.RechargeInfo{UID: uid, TotalRecharge: one.Amount}) } else { res = tx.Model(&common.RechargeInfo{}).Where("uid = ? ", uid). Updates(map[string]interface{}{ "total_charge": gorm.Expr("total_charge + ?", one.Amount), }) } if res.RowsAffected == 0 || res.Error != nil { log.Error("err:%v", res.Error) a.Code = values.CodeRetry return } db.Mysql().Create(&common.RechargeOrder{ UID: uid, OrderID: util.NewOrderID(uid), APIPayID: "", // ProductID: common.ActivityIDPddShare, Amount: one.Amount, WithdrawCash: amount, Status: common.StatusROrderFinish, PaySource: common.PaySourceModulePay, Event: int(common.CurrencyEventShareWithdraw), // PayAccount: payInfo, // Extra: strconv.FormatInt(serviceFee, 10), CallbackTime: time.Now().Unix(), ChannelID: a.Channel, UPI: -1, Scene: common.ActivityIDShare, }) _, err := call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: uid, Value: amount * -1, Event: common.CurrencyEventShareWithdraw, Type: common.CurrencyINR, }, }) if err != nil { a.Code = values.CodeRetry return } a.Msg = "Withdraw to game successfully." return } ip := a.GetRemoteIP() payInfo, code := NewWithdraw(req, a.UID, ip, a.UUID) if code != values.CodeOK { a.Code = code a.Msg = payInfo return } tx := db.Mysql().Begin() defer a.MCommit(tx) // 发起tx // 更新余额 res := tx.Model(&common.ShareInfo{}).Where("uid = ? and reward >= ? and withdrawable >= ?", uid, amount, amount). Updates(map[string]interface{}{ "reward": gorm.Expr("reward - ?", amount), "withdrawable": gorm.Expr("withdrawable - ?", amount), }) if res.RowsAffected == 0 || res.Error != nil { log.Error("err:%v", res.Error) a.Code = values.CodeRetry return } // 更新次数 sw.SubRecord[one.Amount]++ byt, _ := json.Marshal(sw.SubRecord) res = tx.Model(&common.ShareWithdrawInfo{}).Where("uid = ? and day_time = ?", uid, sw.DayTime). Updates(map[string]interface{}{"day_count": sw.DayCount + 1, "day_time": time.Now().Unix(), "record": string(byt), "total_withdraw": gorm.Expr("total_withdraw + ?", one.Amount)}) if res.RowsAffected == 0 || res.Error != nil { log.Error("err:%v", res.Error) a.Code = values.CodeRetry return } orderID := util.NewOrderID(uid) order := &common.RechargeOrder{ UID: uid, OrderID: orderID, APIPayID: "", ProductID: one.ProductID, Amount: one.Amount, WithdrawCash: amount, Status: common.StatusROrderCreate, PaySource: common.PaySourceModulePay, Event: int(common.CurrencyEventWithDraw), PayAccount: payInfo, // Extra: strconv.FormatInt(serviceFee, 10), ChannelID: a.Channel, UPI: -1, Scene: common.ActivityIDShare, } if config.GetBase().Release && amount < con.WithdrawAudit { order.Status = common.StatusROrderWaitting } if err := tx.Model(order).Create(order).Error; err != nil { a.Code = values.CodeRetry log.Error("create withdraw order fail err:%v", err) return } a.Data = values.ShareNewWithdrawResp{TotalBalance: si.Reward - amount, Withdrawable: si.Withdrawable - amount} } func ShareNewWithdrawHis(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareNewWithdrawHisReq) if !a.S(req) { return } if req.Num > 100 { req.Num = 100 } resp := &values.ShareNewWithdrawHisResp{} a.Data = resp list, count := call.GetShareWithdrawHis(a.UID, req.Page, req.Num) resp.Count = count for i, v := range list { if v.Status <= common.StatusROrderCreate { list[i].Status = common.StatusROrderPay } else if v.Status == common.StatusROrderRefuse || v.Status == common.StatusROrderCancel { list[i].Status = common.StatusROrderFail } one := common.WithdrawCommon{} if v.PayAccount != "" { err := json.Unmarshal([]byte(v.PayAccount), &one) if err != nil { log.Error("err:%v", err) continue } } list[i].PayAccount = one.BankCardNo resp.List = append(resp.List, values.OneShareNewWithdrawHis{ CreatedAt: v.CreatedAt.Format("2006-01-02 15:04:05"), OrderID: v.OrderID, PayAccount: v.PayAccount, UID: v.UID, Amount: v.Amount, Event: v.Event, ProductID: v.ProductID, Status: v.Status, FailReason: v.FailReason, ChannelID: v.ChannelID, UPI: v.UPI, Scene: v.Scene, WithdrawCash: v.WithdrawCash, }) } } // todo // ShareCfg 分享配置数据 func ShareCfg(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() if !a.CheckActivityExpire(common.ActivityIDShare) { return } resp := &values.ShareCfgResp{} a.Data = resp resp.ShareCfg = call.GetConfigShareAll() shareInfo := call.GetShareInfo(a.UID) resp.ShareLevel = shareInfo.Level resp.InviteCount = shareInfo.Down1 + shareInfo.Down2 + shareInfo.Down3 + shareInfo.Down4 + shareInfo.Down5 resp.BetCount = shareInfo.BetAmountTeam resp.Amount = shareInfo.Withdrawable resp.TotalAward = shareInfo.Reward err := db.Mysql().C().Model(&common.ShareReward{}). Select("sum(reward_count) as totayAmount"). Where("uid = ? and reward_at > ?", a.UID, util.GetZeroTime(time.Now()).Unix()). Scan(&resp.TotalAward).Error if err != nil { log.Error("get totayAmount err, %s", err.Error()) } resp.ShareLink = call.GetShareLink(a.Channel, a.UID) } // Reward 奖励页面数据 func Reward(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() resp := &values.RewardResp{} a.Data = resp if !a.CheckActivityExpire(common.ActivityIDShare) { return } jackpot, _ := call.ShareRankJackpotGet() resp.JackPot = jackpot weekAt := util.GetWeekZeroTime(time.Now()) shareRankUsers, _, err := call.ShareRankUserGet(1, 3, weekAt, false) if err != nil { log.Error("get share rank user err, %s", err.Error()) a.Code = values.CodeRetry return } resp.TopUsers = make([]values.ShareRankUser, 0, len(shareRankUsers)) rankAwards := call.GetConfigShareRankAwardMap() for index, shareRankUser := range shareRankUsers { var userAward int var userAwardExpected int64 rank := index + 1 if rankAwards != nil { if rankAward, ok := rankAwards[index+1]; ok { userAward = rankAward.AwardRate userAwardExpected = jackpot * int64(rankAward.AwardRate) / 10000 } } resp.TopUsers = append(resp.TopUsers, values.ShareRankUser{ UserRank: rank, UserName: shareRankUser.UserInfo.Nick, UserCount: shareRankUser.UserAwardCount, UserIcon: shareRankUser.UserInfo.Avatar, UserAward: userAward, UserAwardExpected: userAwardExpected, }) } // 任务详情 list := []common.ShareTaskNewData{} db.Mysql().QueryAll(fmt.Sprintf("uid = %d", a.UID), "", &common.ShareTaskNewData{}, &list) for _, v := range list { one := values.OneShareNewTask{ TaskID: v.TaskID, Desc: v.GetDesc(), Type: v.Type, Progess: v.Progress, Target: v.Target, Reward: v.Reward, } if one.Progess >= one.Target || v.Status == 1 { one.Progess = one.Target if v.Status == 1 { one.Status = 2 } else { one.Status = 1 } } resp.TaskList = append(resp.TaskList, one) } } // RewardDetails 玩家奖励详情 func RewardDetails(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.RewardDetailsReq) if !a.S(req) { return } resp := &values.RewardDetailsResp{} a.Data = resp if !a.CheckActivityExpire(common.ActivityIDShare) { return } mdb := db.Mysql().C().Model(&common.ShareReward{}).Where("uid = ?", a.UID) if req.RewardType != 0 { mdb = mdb.Where("reward_type = ?", req.RewardType) } if req.StartAt != 0 { mdb = mdb.Where("reward_at >= ?", req.StartAt) } if req.EndAt != 0 { mdb = mdb.Where("reward_at <= ?", req.EndAt) } err := mdb.Count(&resp.Total).Error if err != nil { log.Error("get total err, %s", err.Error()) a.Code = values.CodeRetry return } // 计算奖励金额总和 var rewardAmount int64 err = mdb.Select("COALESCE(SUM(reward_count), 0)").Row().Scan(&rewardAmount) if err != nil { log.Error("get reward amount err, %s", err.Error()) a.Code = values.CodeRetry return } resp.RewardAmount = rewardAmount err = mdb.Order("reward_at desc").Offset((req.Page - 1) * req.PageSize).Limit(req.PageSize).Find(&resp.List).Error if err != nil { log.Error("get list err, %s", err.Error()) a.Code = values.CodeRetry return } } // RankDetails 排行榜详情 func RankDetails(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.RankDetailsReq) if !a.S(req) { return } resp := &values.RankDetailsResp{} a.Data = resp if !a.CheckActivityExpire(common.ActivityIDShare) { return } rankAt := util.GetWeekZeroTime(time.Now()) if req.Previous { rankAt = rankAt.AddDate(0, 0, 7) } shareRankUsers, count, err := call.ShareRankUserGet(req.Page, req.PageSize, rankAt, true) if err != nil { log.Error("get rank user err, %s", err.Error()) a.Code = values.CodeRetry return } jackpot, _ := call.ShareRankJackpotGet() if req.Previous { jackpot = call.ShareRankJackpotPreGet() } resp.Total = count rankAwards := call.GetConfigShareRankAwardMap() for index, shareRankUser := range shareRankUsers { var userAward int var userAwardExpected int64 rank := index + 1 if !req.Previous { if rankAwards != nil { if rankAward, ok := rankAwards[index+1]; ok { userAward = rankAward.AwardRate userAwardExpected = jackpot * int64(rankAward.AwardRate) / 10000 } } } else { userAward = shareRankUser.UserAward userAwardExpected = shareRankUser.UserAwardCount } resp.RankUsers = append(resp.RankUsers, values.ShareRankUser{ UserRank: rank, UserName: shareRankUser.UserInfo.Nick, UserCount: shareRankUser.UserAwardCount, UserIcon: shareRankUser.UserInfo.Avatar, UserAward: userAward, UserAwardExpected: userAwardExpected, }) } } func ShareBanner(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() resp := &values.ShareBannerResp{} a.Data = resp shareBanners := call.GetConfigShareBanner() if len(shareBanners) == 0 { return } shareBanner := shareBanners[0] resp.SearchWord = shareBanner.SearchWord resp.JpgUrl = shareBanner.URL resp.Desc = shareBanner.Desc shareInfo := call.GetShareInfo(a.UID) resp.ShareCode = shareInfo.Share resp.ShareLink = call.GetShareLink(a.Channel, a.UID) } func ShareWithdraw(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareWithdrawReq) if !a.S(req) { return } if req.Opt == 0 { req.Opt = 1 } uid := a.UID shareInfo := call.GetShareInfo(uid) if shareInfo.Reward < req.Amount { a.Code = values.CodeParam a.Msg = "Insufficient balance." return } con := call.GetConfigShare(shareInfo.Level, a.Channel) if con == nil { a.Code = values.CodeRetry return } sw := call.GetShareWithdrawInfo(uid) if sw.DayCount >= con.DayWithdrawCount { a.Code = values.CodeParam a.Msg = "Withdrawal limit." return } err := call.UpdateShare(uid, 5, req.Amount, fmt.Sprintf("%d", req.Amount)) if err != nil { log.Error("update share err, %s", err.Error()) a.Code = values.CodeRetry return } _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: uid, Value: req.Amount, Event: common.CurrencyEventShare, Type: common.CurrencyINR, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, req.Amount, 1), }, }) if err != nil { log.Error("update balance err, %s", err.Error()) call.UpdateShare(uid, 6, req.Amount, "callback") a.Code = values.CodeRetry return } }