package statistics import ( "fmt" "server/common" "server/db" "server/modules/backend/app" "server/modules/backend/bdb" "server/modules/backend/models" utils "server/modules/backend/util" "server/modules/backend/values" "server/util" "sort" "sync" "time" "github.com/gin-gonic/gin" ) // 数据总览 func PlatformData(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.PlatformDataReq) if !a.S(req) { return } resp := values.PlatformDataResp{} cids := []*int{} if req.Channel != nil { cids = []*int{req.Channel} } else if len(a.User.SChannels) > 0 { for i := range a.User.SChannels { cids = append(cids, &a.User.SChannels[i]) } } var oneDay int64 = 24 * 60 * 60 su, eu := utils.GetQueryUnix(req.Start, req.End) if eu-su > 60*oneDay { a.Code = values.CodeParam return } zeroTime := util.GetZeroTime(time.Now()).Unix() resp.Count = (eu - su) / (24 * 60 * 60) list := []*values.PlatformData{} cid := -1 if len(cids) == 0 { cid = 0 } else if len(cids) == 1 { cid = *cids[0] } if cid >= 0 { bdb.BackDB.QueryAll(fmt.Sprintf("Time >= %d and Time <= %d and PlatformID = %d", su, eu, cid), "", &values.PlatformData{}, &list) } // 协程并发查询 resp.PlatformData = make([]*values.PlatformData, resp.Count) step := 0 group := new(sync.WaitGroup) group.Add(int(resp.Count)) for i := su; i < eu; i += oneDay { tmp := step t := i util.Go(func() { var one *values.PlatformData if cid < 0 { one = GetPlatformData(t, t+oneDay, cids...) } else { for _, v := range list { if v.Time == t { one = v break } } tag := one == nil if tag || !one.Check { one = GetPlatformData(t, t+oneDay, &cid) one.Check = true // 当天数据不缓存 if t >= zeroTime { one.Check = false } if tag { bdb.BackDB.Create(one) } else { bdb.BackDB.UpdateW(&values.PlatformData{}, one, fmt.Sprintf("Time = %d and PlatformID = %d", t, cid)) } } } resp.PlatformData[tmp] = one group.Done() }) step++ } group.Wait() sort.Slice(resp.PlatformData, func(i, j int) bool { return resp.PlatformData[i].Time > resp.PlatformData[j].Time }) left := (req.Page - 1) * req.Num right := req.Page * req.Num if right > len(resp.PlatformData) { right = len(resp.PlatformData) } resp.PlatformData = resp.PlatformData[left:right] a.Data = resp } func GetPlatformData(start, end int64, platform ...*int) *values.PlatformData { ret := &values.PlatformData{} if len(platform) == 1 { ret.PlatformID = *platform[0] if ret.PlatformID == 0 { platform = []*int{} } } ret.Time = start ret.Date = time.Unix(start, 0).Format("20060102") // 新增安装数 ret.DownloadCount = models.GetDownloadCounts(&start, &end, platform...) // 完成注册数 ret.NewCount = models.GetNewPlayerCountBySqls(start, end, platform...) // 新增注册率 = 新增注册用户/新增安装用户 // 计算去重注册人数 sqlNew := fmt.Sprintf("SELECT count(DISTINCT(deviceid)) FROM users WHERE birth >= %v and birth < %v %v", start, end, models.PackChannels(platform...)) var disNewCount int64 db.Mysql().C().Raw(sqlNew).Scan(&disNewCount) ret.NewRegisterPer = utils.GetPer(disNewCount, ret.DownloadCount) // 新增付费人数 ret.NewPayCount = models.GetNewPayCountBySqls(start, end, platform...) // 新增付费率 = 新增付费人数/新增注册人数 ret.NewPayPer = utils.GetPer(ret.NewPayCount, ret.NewCount) // 新增付费次数 ret.NewPayCountAll = models.GetNewPayCounts(start, end, platform...) // 新户复充率 ret.NewPayMultiPer = utils.GetPer(models.GetNewMultiPayCountBySqls(start, end, platform...), ret.NewPayCount) // 新增充值总额 ret.NewPayAmount = models.GetNewPayAmountBySqls(start, end, common.CurrencyINR, platform...) // 新增arppu ret.NewPayARPPU = utils.GetPoint(ret.NewPayAmount, ret.NewPayCount*common.DecimalDigits) // 新增赠送人数 ret.NewWithdrawCount = models.GetNewWithdrawPlayerNum(start, end, platform...) // 新增赠送总额 ret.NewWithdrawTotal = models.GetNewWithdrawAmount(start, end, platform...) // 新增赠送比例 ret.NewWithdrawPer = utils.GetPer(ret.NewWithdrawTotal, ret.NewPayAmount) // 老用户付费人数 ret.OldPayCount = models.GetOldPayCountBySqls(start, end, platform...) // 老用户付费次数 ret.OldPayCountAll = models.GetOldPayCounts(start, end, platform...) // 老户复充率 ret.OldPayMultiPer = utils.GetPer(models.GetOldMultiPayCountBySqls(start, end, platform...), ret.OldPayCount) // 老用户付费金额 ret.OldPayAmount = models.GetOldPayAmountBySqls(start, end, common.CurrencyINR, platform...) // 老户ARPPU ret.OldPayARPPU = utils.GetPoint(ret.OldPayAmount, ret.OldPayCount*common.DecimalDigits) // 老户赠送人数 ret.OldWithdrawCount = models.GetOldWithdrawplayerNum(start, end, platform...) // 老户总赠送 ret.OldWithdrawTotal = models.GetOldWithdrawAmount(start, end, platform...) // 老户赠送比例 ret.OldWithdrawPer = utils.GetPer(ret.OldWithdrawTotal, ret.OldPayAmount) // 总付费人数 ret.PayCount = ret.NewPayCount + ret.OldPayCount // 总付费 ret.RechargeTotal = ret.NewPayAmount + ret.OldPayAmount // 总ARPPU ret.PayARPPU = utils.GetPoint(ret.RechargeTotal, ret.PayCount*common.DecimalDigits) // 总赠送人数 ret.WithdrawPlayerNum = ret.NewWithdrawCount + ret.OldWithdrawCount // 总赠送 ret.WithdrawTotal = ret.NewWithdrawTotal + ret.OldWithdrawTotal // 总赠送比例 ret.WithdrawPer = utils.GetPer(ret.WithdrawTotal, ret.RechargeTotal) // 总投注 ret.PlatformBet = models.GetGameInOut(start, end, 1, platform...) // 总返奖 ret.PlatformSettle = models.GetGameInOut(start, end, 2, platform...) // 厂商投注 ret.ProviderBet = ret.PlatformBet // 厂商返奖 ret.ProviderSettle = ret.PlatformSettle // 活跃留存 ret.ActiveKeep = models.GetKeepPer(1, ret.Date, start, platform...) // 总付费留存 ret.RechargeKeep = models.GetKeepPer(2, ret.Date, start, platform...) // 新增付费留存 ret.NewRechargeKeep = models.GetKeepPer(3, ret.Date, start, platform...) return ret }