Files
stat_center/skd/job/statlandpage/statlandpage.go
T
2026-05-20 16:13:58 +08:00

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)
}