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 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]), } } 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"}), // 需要更新的列 }).CreateInBatches(&userBehaviorList, 1000).Error if err != nil { global.App.Log.Error("更新用户在线时长错误", err.Error()) return } fmt.Println("存入汇总完成:", time.Since(start1)) } }