package crons import ( "designs/global" "designs/model" "designs/service" "fmt" "gorm.io/gorm/clause" "time" ) func Behavior() { //先查出所有gid ActiveGid := service.GetActiveGid() //现在直接汇总所有的数据(直到前一天的) now := time.Now() end := now.AddDate(0, 0, -1) start, _ := time.Parse("2006-01-02 15:04:05", "2025-05-17 15:04:05") BehaviorSummary("wx", ActiveGid, start, end) BehaviorSummary("tt", ActiveGid, start, end) global.App.Log.Info("重新汇总用户在线时长数据完成") } func BehaviorSummary(pf string, ActiveGid []string, start time.Time, end time.Time) { //循环一下,查出userId 跟相关的在线数据 for _, gid := range ActiveGid { start1 := time.Now() fmt.Println("处理数据开始,gid :", gid) //查询 30天内的在线数据 SummaryData, err := service.UserOnlineSummary(gid, pf, "", start.Format("2006-01-02 15:04:05"), end.Format("2006-01-02 15:04:05")) if err != nil { global.App.Log.Error("更新用户在线时长错误(查询汇总信息错误)", err.Error()) return } //查询用户的登录次数 var loginData []struct { UserId int `json:"userId" gorm:"not null;column:userId;"` LoginCount int `json:"loginCount" gorm:"not null;column:loginCount;"` } loginDataMap := make(map[int]int) err = global.App.DB.Table("user_login"). Where("gid", gid). Where("pf", pf). Group("userId"). Select("count(*) as loginCount", "userId"). Scan(&loginData).Error if err != nil { global.App.Log.Error("更新用户在线时长错误(查询汇总信息错误)", err.Error()) return } for _, login := range loginData { loginDataMap[login.UserId] = login.LoginCount } fmt.Println("查询登录数据完成:", time.Since(start1)) //查询用户的看广告次数,广告看完次数 var seeAdsData []struct { UserId int `json:"userId" gorm:"not null;column:userId;"` SeeAdsCount int `json:"seeAdsCount" gorm:"not null;column:seeAdsCount;"` State2Count int `json:"state2Count" gorm:"not null;column:state2Count;"` } seeAdsDataMap := make(map[int]int) seeAdsDataMap2 := make(map[int]int) err = global.App.DB.Table("user_see_ads"). Where("gid", gid). Where("pf", pf). Group("userId"). Select("count(*) as seeAdsCount", "SUM(CASE WHEN adsState = 2 THEN 1 ELSE 0 END) AS state2Count", "userId"). Scan(&seeAdsData).Error if err != nil { global.App.Log.Error("更新用户在线时长错误(查询汇总信息错误)", err.Error()) return } for _, ads := range seeAdsData { seeAdsDataMap[ads.UserId] = ads.SeeAdsCount seeAdsDataMap2[ads.UserId] = ads.State2Count } fmt.Println("查询广告数据完成:", time.Since(start1)) //格式化,存入数据库 var userIdList []model.User err = global.App.DB.Table("user").Where("gid", gid). Select("id", "userId"). Where("pf", pf).Scan(&userIdList).Error if err != nil { global.App.Log.Error("更新用户在线时长错误(查询userID 错误)", err.Error()) return } //fmt.Println(len(userIdList)) userBehavior := make(map[int]model.UserBehavior) for _, users := range userIdList { userBehavior[users.UserId] = model.UserBehavior{ ID: users.ID, Duration: int(SummaryData[users.UserId]), StartNum: loginDataMap[users.UserId], AdCount: seeAdsDataMap[users.UserId], AdExpCount: seeAdsDataMap2[users.UserId], } } var userBehaviorList []model.UserBehavior for _, Behavior := range userBehavior { userBehaviorList = append(userBehaviorList, Behavior) } err = global.App.DB.Table("user_behavior").Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, // 冲突列(主键) DoUpdates: clause.AssignmentColumns([]string{"duration", "startNum", "adCount", "adExpCount"}), // 需要更新的列 }).CreateInBatches(&userBehaviorList, 1000).Error if err != nil { global.App.Log.Error("更新用户在线时长错误", err.Error()) return } fmt.Println("存入汇总完成:", time.Since(start1)) } }