印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

196 lines
6.0 KiB

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
}