135 lines
3.3 KiB
Go
135 lines
3.3 KiB
Go
package statlandpage
|
|
|
|
import (
|
|
"context"
|
|
"stat/common/log"
|
|
"stat/common/utils"
|
|
"stat/models/appInfoMod"
|
|
"stat/models/downloadCpc"
|
|
"stat/models/downloadinfo"
|
|
"stat/models/downloadstat"
|
|
"stat/models/registermod"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
)
|
|
|
|
const (
|
|
LandPageStat string = "landPageStat" // 落地页统计
|
|
)
|
|
|
|
func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time {
|
|
return map[string]time.Time{
|
|
LandPageStat: defaultStatDate, // 落地页统计
|
|
}
|
|
}
|
|
|
|
func statLandPageDailyApps(ctx context.Context, start, end time.Time) error {
|
|
appIds, err := appInfoMod.GetAppIds(ctx)
|
|
if err != nil {
|
|
log.Error("GetAppIds failed!", log.E(err))
|
|
return err
|
|
}
|
|
for _, id := range appIds {
|
|
if err := statLandPage(ctx, start, end, id, downloadstat.StatTypeDaily); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
time.Sleep(3 * time.Second)
|
|
return nil
|
|
}
|
|
|
|
func statLandPageHourApps(ctx context.Context, start, end time.Time) error {
|
|
appIds, err := appInfoMod.GetAppIds(ctx)
|
|
if err != nil {
|
|
log.Error("GetAppIds failed!", log.E(err))
|
|
return err
|
|
}
|
|
for _, id := range appIds {
|
|
if err := statLandPage(ctx, start, end, id, downloadstat.StatTypeHour); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func statLandPage(ctx context.Context, start, end time.Time, appId int32, statType downloadstat.StatType) error {
|
|
old, err := downloadstat.FindOneStat(ctx, bson.M{
|
|
"appId": appId,
|
|
"type": statType,
|
|
"sumDate": start,
|
|
})
|
|
if err != nil {
|
|
if err != mongo.ErrNoDocuments {
|
|
return err
|
|
}
|
|
}
|
|
if old != nil {
|
|
return nil // 已经存在
|
|
}
|
|
visitTotal := int64(0)
|
|
visitDict := make(map[string]int64)
|
|
visitList, err := downloadCpc.FindManyDownloadCpc(ctx, bson.M{
|
|
"appId": appId,
|
|
"createdAt": bson.M{"$gte": start, "$lt": end},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, visit := range visitList {
|
|
visitTotal++
|
|
visitDict[visit.IP]++
|
|
}
|
|
downTotal := int64(0)
|
|
downDict := make(map[string]int64)
|
|
downDictEx := make(map[string]int64)
|
|
downList, err := downloadinfo.FindManyDownloadInfo(ctx, bson.M{
|
|
"appId": appId,
|
|
"createdAt": bson.M{"$gte": start.Add(-time.Hour), "$lt": end},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, down := range downList {
|
|
downDictEx[down.IP]++
|
|
if !down.CreatedAt.Before(start) && down.CreatedAt.Before(end) {
|
|
downTotal++
|
|
downDict[down.IP]++
|
|
}
|
|
}
|
|
registerDict := make(map[string]int64)
|
|
var registerCount int64
|
|
err = registermod.RegisterUsersInfoByTimeShard(ctx, appId, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) {
|
|
if _, exists := downDictEx[item.IP]; exists {
|
|
registerDict[item.IP]++
|
|
registerCount++ // 这里只计算来自落地页的注册
|
|
}
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
stat := &downloadstat.Stat{
|
|
ID: primitive.NewObjectID(),
|
|
AppId: appId,
|
|
SumDate: start,
|
|
EndDate: end,
|
|
Hour: start.Hour(),
|
|
Type: statType,
|
|
VisitTotal: visitTotal,
|
|
VisitUnique: int64(len(visitDict)),
|
|
DownTotal: downTotal,
|
|
DownUnique: int64(len(downDict)),
|
|
InstallTotal: registerCount, // 落地页注册
|
|
InstallUnique: int64(len(registerDict)),
|
|
UpdatedAt: time.Now(),
|
|
CreatedAt: time.Now(),
|
|
}
|
|
|
|
return downloadstat.InsertOneStat(ctx, stat)
|
|
}
|