package task import ( "github.com/furryboard/spider-scheduler/pkg/dao" "github.com/furryboard/spider-scheduler/pkg/dao/model" "github.com/furryboard/spider-scheduler/pkg/exception" "github.com/furryboard/spider-scheduler/pkg/log" "github.com/furryboard/spider-scheduler/pkg/logic" "math" "time" ) // UpdateUserInfo 更新数据库内用户信息 // 会对原始表进行更改,并将更改记录写入changelogs func UpdateUserInfo() { // 预查询数量 // TODO: 预查询数量和分页策略功能可复用 var count int64 tx := dao.DB().Model(&model.Furry{}).Count(&count) if tx.Error != nil { err := exception.ErrFetchFurries("获取furries数量失败:" + tx.Error.Error()) log.Logger().Errorf("获取furries数量失败:%s", err) return } pageSize := 1 maxPage := int(math.Ceil(float64(count) / float64(pageSize))) for page := 0; page <= maxPage; page++ { // 获取目标用户列表(分页) users, err := logic.GetValidUsers(page, pageSize) if err != nil { log.Logger().Errorf("获取用户列表时发生错误:%s", err) continue } // 已获取完毕 if users == nil { return } // 抽取uid列表 var uids []uint for _, user := range users { uids = append(uids, user.UID) } // 通过API获取用户信息 infos := logic.BatchGetUserInfo(&uids) // 检查更新内容,更新furries表,插入changelogs(使用事务) c, err := logic.UpdateUserInfo(users, infos) if err != nil { log.Logger().Errorf("更新数据时发生错误:%s", err) continue } log.Logger().Infof("成功更新了%d个用户信息", c) // delay time.Sleep(2 * time.Second) } } // UpdateFans 更新粉丝数,将记录写入表中,增量记录 func UpdateFans() { // TODO: 与UpdateUserInfo有大量重复,可抽离复用代码 // 预查询数量 var count int64 //tx := dao.DB().Model(&model.Furry{}).Where("status = 0").Count(&count) tx := dao.DB().Model(&model.Furry{}).Count(&count) if tx.Error != nil { err := exception.ErrFetchFurries("获取furries数量失败:" + tx.Error.Error()) log.Logger().Errorf("获取furries数量失败:%s", err) return } pageSize := 4 maxPage := int(math.Ceil(float64(count) / float64(pageSize))) for page := 0; page <= maxPage; page++ { // 获取目标用户列表(分页) users, err := logic.GetValidUsers(page, pageSize) if err != nil { log.Logger().Errorf("获取用户列表时发生错误:%s", err) continue } // 已获取完毕 if users == nil { return } // 抽取uid列表 var uids []uint for _, user := range users { uids = append(uids, user.UID) } // 通过API获取用户统计信息 stats := logic.BatchGetUserStat(&uids) // 插入表 c, err := logic.UpdateFansToDB(stats) if err != nil { log.Logger().Errorf("更新粉丝数量时发生错误:%s", err) return } log.Logger().Infof("成功更新了%d个用户粉丝数", c) time.Sleep(2 * time.Second) } }