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.
191 lines
6.4 KiB
191 lines
6.4 KiB
package statistics |
|
|
|
import ( |
|
"fmt" |
|
"server/common" |
|
"server/db" |
|
"server/modules/backend/app" |
|
"server/modules/backend/models" |
|
utils "server/modules/backend/util" |
|
"server/modules/backend/values" |
|
"server/util" |
|
"strconv" |
|
"time" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/liangdas/mqant/log" |
|
"github.com/olivere/elastic/v7" |
|
) |
|
|
|
// rechargeFrequency 充值频率 |
|
func RechargeFrequency(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.RechargeFrequencyReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
|
|
var oneDay int64 = 24 * 60 * 60 |
|
var resp values.RechargeFrequencyResp |
|
su, eu := utils.GetQueryUnix(req.Start, req.End) |
|
|
|
e := eu - int64(((req.Page-1)*req.Num)*24*60*60) |
|
s := e - int64((req.Num-1)*24*60*60) |
|
if s < su { |
|
s = su |
|
} |
|
resp.Count = (eu - su) / (24 * 60 * 60) |
|
|
|
var channelId int |
|
if req.Channel != nil { |
|
channelId = *req.Channel |
|
} |
|
|
|
// 今天的数据直接从缓存读取 |
|
now := util.GetZeroTime(time.Now()).Unix() |
|
if su >= now { |
|
one := values.GetRechargeFrequencyData(su, channelId) |
|
if one == nil { |
|
one = GetRechargeFrequency(su, req.Channel) |
|
} |
|
resp.List = append(resp.List, one) |
|
} else { |
|
one := &values.RechargeFrequency{} |
|
q := elastic.NewBoolQuery() |
|
q.Must(elastic.NewMatchQuery("Channel", channelId)) |
|
q.Must(elastic.NewMatchQuery("Date", su)) |
|
db.ES().QueryOne(common.ESIndexBackRechargeFrequency, q, &one) |
|
// 两种情况需要重新拉取 1没有数据 2订单总数有变动的时候 |
|
if len(one.List) == 0 { |
|
one = GetRechargeFrequency(su, req.Channel) |
|
id := fmt.Sprintf("%v_%v", su, channelId) |
|
db.ES().InsertToESByIDGO(common.ESIndexBackRechargeFrequency, id, one) |
|
} else { |
|
var total int64 |
|
for _, v := range one.List { |
|
total += v.RechargeOrderCount + v.RechargeSuccessOrderCount |
|
} |
|
newTotal := models.GetNewRechargeOrderCountBySql2(req.Channel, su, su+oneDay) + models.GetNewRechargeSuccessOrderCountBySql2(req.Channel, su, su+oneDay) |
|
if newTotal != total { |
|
var hour int64 = 60 * 60 |
|
channel := req.Channel |
|
for i := 0; i < 24; i++ { |
|
detail := one.List[i] |
|
// 充值玩家数量 |
|
detail.RechargePlayerCount = models.GetRechargeSuPlayerCountBySql(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
var err error |
|
// 超过24小时的老数据不会改变 |
|
if time.Now().Unix()-(su+int64(i)*hour) < 24*hour { |
|
// 玩家24小时内付费金额 |
|
detail.PayAmount24 = models.Get24HourNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 玩家24小时付费率 |
|
point2 := utils.GetPoint2(models.Get24HourNewPlayerPayCount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour), detail.RegisterPlayerCount) |
|
detail.PayAmount24Per, err = strconv.ParseFloat(point2, 64) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
} |
|
|
|
// 玩家总付费金额 |
|
detail.PayAmountTotal = models.GetNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 玩家总付费率 |
|
point3 := utils.GetPoint2(detail.RechargePlayerCount, detail.RegisterPlayerCount) |
|
detail.PayAmountTotalPer, err = strconv.ParseFloat(point3, 64) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
|
|
// 充值成功订单数 |
|
detail.RechargeSuccessOrderCount = models.GetNewRechargeSuccessOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 玩家充值总订单数 |
|
detail.RechargeOrderCount = models.GetNewRechargeOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 支付成功率 |
|
detail.RechargeSuccessPer, err = strconv.ParseFloat(utils.GetPoint2(detail.RechargeSuccessOrderCount, detail.RechargeOrderCount), 5) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
one.List[i] = detail |
|
} |
|
id := fmt.Sprintf("%v_%v", su, channelId) |
|
db.ES().DeleteByID(common.ESIndexBackRechargeFrequency, id) |
|
db.ES().InsertToESByIDGO(common.ESIndexBackRechargeFrequency, id, one) |
|
} |
|
} |
|
resp.List = append(resp.List, one) |
|
} |
|
|
|
a.Data = resp |
|
} |
|
|
|
func GetRechargeFrequency(su int64, channel *int) *values.RechargeFrequency { |
|
var recharge values.RechargeFrequency |
|
var hour int64 = 60 * 60 |
|
recharge.Date = su |
|
now := util.GetZeroTime(time.Now()).Unix() |
|
recharge.List = make([]values.RechargeFrequencyDetail, 24) |
|
nowHour := time.Now().Hour() + 1 |
|
recharge.Channel = 0 |
|
if channel != nil { |
|
recharge.Channel = *channel |
|
} |
|
for i := 0; i < 24; i++ { |
|
detail := values.RechargeFrequencyDetail{} |
|
// 时间 |
|
detail.Date = su + (int64(i)+1)*hour - 30*60 |
|
|
|
// 查询今日的 |
|
if now == su && i > nowHour { |
|
break |
|
} |
|
|
|
// 玩家注册数量 |
|
detail.RegisterPlayerCount = models.GetNewPlayerCountBySqlT(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
|
|
// 充值玩家数量 |
|
detail.RechargePlayerCount = models.GetRechargeSuPlayerCountBySql(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
|
|
// 当天玩家付费率 |
|
point := utils.GetPoint2(models.GetNewPlayerPayDisCount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour, su+24*hour), detail.RegisterPlayerCount) |
|
res, err := strconv.ParseFloat(point, 64) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
// 新用户付费率 |
|
detail.NewPlayerRechargePer = res |
|
|
|
// 玩家24小时内付费金额 |
|
detail.PayAmount24 = models.Get24HourNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 玩家24小时付费率 |
|
point2 := utils.GetPoint2(models.Get24HourNewPlayerPayCount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour), detail.RegisterPlayerCount) |
|
detail.PayAmount24Per, err = strconv.ParseFloat(point2, 64) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
|
|
// 玩家总付费金额 |
|
detail.PayAmountTotal = models.GetNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 玩家总付费率 |
|
point3 := utils.GetPoint2(detail.RechargePlayerCount, detail.RegisterPlayerCount) |
|
detail.PayAmountTotalPer, err = strconv.ParseFloat(point3, 64) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
|
|
// 充值成功订单数 |
|
detail.RechargeSuccessOrderCount = models.GetNewRechargeSuccessOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 玩家充值总订单数 |
|
detail.RechargeOrderCount = models.GetNewRechargeOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour) |
|
// 支付成功率 |
|
detail.RechargeSuccessPer, err = strconv.ParseFloat(utils.GetPoint2(detail.RechargeSuccessOrderCount, detail.RechargeOrderCount), 5) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
|
|
recharge.List[i] = detail |
|
} |
|
|
|
return &recharge |
|
}
|
|
|