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