Files
2026-05-20 16:13:58 +08:00

93 lines
2.6 KiB
Go

package statlandpage
import (
"context"
"fmt"
"stat/common/log"
"stat/common/statutils"
"stat/common/utils"
statrecordmod "stat/models/statrecord"
"time"
)
type StatMethod func(ctx context.Context, start, end time.Time) error
type TimeAlignFunc func(t time.Time) time.Time
func timeAlignForDaily(t time.Time) time.Time {
return utils.BeginWithTime(t)
}
func timeAlignForHour(t time.Time) time.Time {
return utils.RecentMinute(t, 60)
}
func RunStatHour(defaultStatDate time.Time) error {
ctx := context.Background()
job := statrecordmod.LandPageHourStatJob
recordMap := defaultTimeMap(defaultStatDate)
return recordStat(ctx, recordMap, job, time.Hour, -time.Hour, statLandPageHourApps, timeAlignForHour)
}
func RunStatDaily(defaultStatDate time.Time) error {
ctx := context.Background()
job := statrecordmod.LandPageDailyStatJob
recordMap := defaultTimeMap(defaultStatDate)
return recordStat(ctx, recordMap, job, 24*time.Hour, -time.Hour, statLandPageDailyApps, timeAlignForDaily)
}
// recordStat 统计
func recordStat(ctx context.Context, recordMap map[string]time.Time, job string, timeStep, timeBack time.Duration, stat StatMethod, align TimeAlignFunc) error {
recordResult, err := statrecordmod.LastRecordTimeMap(ctx, job) //第一次从默认记录时间开始统计
if err != nil {
log.Error("LastRecordTimeMap", log.E(err))
return err
}
for _, record := range recordResult {
recordMap[record.Item] = record.RecordTime
}
now := time.Now().Add(timeBack)
curStatTime := align(now)
for item, lastStatAt := range recordMap {
_lastStatAt := align(lastStatAt)
for curStatTime.After(_lastStatAt) {
end := _lastStatAt.Add(timeStep)
fmt.Printf("item:%s, start:%s, end:%s\n", item, _lastStatAt, end)
err := runStatMethod(ctx, item, job, _lastStatAt, end, stat)
if err != nil {
log.Error("recordStat failed!", log.E(err), log.Any("item", item), log.Any("job", job))
return err
}
_lastStatAt = end
}
recordMap[item] = _lastStatAt
}
return err
}
// runStatMethod 调用统计项方法
func runStatMethod(ctx context.Context, item, job string, start, end time.Time, stat StatMethod) error {
var err error
// 调用统计方法,获取数据
err = statutils.ServerMon.RunWithName(func() error {
return stat(ctx, start, end)
}, statutils.GetFuncName(stat))
if err != nil {
log.Error("runStatMethod failed!", log.Any("statItem", item), log.E(err))
return err
}
if err := statrecordmod.UpsertItemRecord(ctx, job, item, end); err != nil {
log.Error("commit UpsertItemRecord failed!", log.E(err))
return err
}
return nil
}