|
|
|
|
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.NewPayRepeatCount = models.GetNewPayRepeatCountBySqls(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
|
|
|
|
|
}
|