// Package asUser ----------------------------- // @file : scheduler.go // @author : JJXu // @contact : wavingbear@163.com // @time : 2024/7/5 下午5:42 // ------------------------------------------- package asUser import ( "context" "encoding/json" "errors" "github.com/fonchain_enterprise/fonchain-main/api/artistInfoUser" "github.com/fonchain_enterprise/fonchain-main/pkg/cache" "github.com/fonchain_enterprise/fonchain-main/pkg/config" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/robfig/cron/v3" "go.uber.org/zap" "sort" "sync" "time" ) const ( CacheKeyInviteList = "inviteList" CacheKeyInviteListCosts = "inviteListMaxCosts" QueryInvitePageSize = 100 ) var cacheInviteLocker = sync.Mutex{} var CacheInviteList = new(cacheInviteList) type cacheInviteList struct { } func (d *cacheInviteList) AddTimerTask(c *cron.Cron) error { //go d.TaskRun() var cronTime = "*/5 * * * *" if config.Env != "prod" { cronTime = "*/2 * * * *" } _, err := c.AddFunc(cronTime, func() { if err := d.TaskRun(); err != nil { zap.L().Error("定时任务执行失败,err:" + err.Error()) } }) return err } func (d *cacheInviteList) TaskRun() error { start := time.Now() var data []InviteUserType var err error var page int64 = 1 var total int64 data, total, err = d.getInviteList(page) for page*QueryInvitePageSize < total { page++ var tmp []InviteUserType tmp, _, err = d.getInviteList(page) if err != nil { return err } data = append(data, tmp...) } //存入缓存 err = d.SetCache(data, time.Now().Sub(start)) return err } func (d *cacheInviteList) getInviteList(page int64) (data []InviteUserType, total int64, err error) { res, err := service.GrpcArtistInfoUserImpl.GetInvitedUserList(context.Background(), &artistInfoUser.GetInvitedUserListRequest{ InviterCode: "g5BDC9xr", //这个参数没用,但是留着 Page: page, PageSize: QueryInvitePageSize, RemoveHiddenObjects: "1", //去除不对经纪人展示的画家 OmitJoinShow: true, //经纪人管理模块需要忽略已经参加过画展的画家 }) if err != nil { err = errors.New("获取邀请列表失败") return } total = res.Page.Total data, err = GetInviteListDataHandle(res.Data) if err != nil { err = errors.New("邀请列表数据处理数据失败") return } return } func (d *cacheInviteList) SetCache(data []InviteUserType, cost time.Duration) (err error) { cacheInviteLocker.Lock() defer cacheInviteLocker.Unlock() sort.Slice(data, func(i, j int) bool { return data[i].InvitedUser.UserId > data[j].InvitedUser.UserId }) bytes, err := json.Marshal(&data) if err != nil { return err } err = cache.RedisClient.Set(CacheKeyInviteList, string(bytes), 0).Err() lastCost, _ := cache.RedisClient.Get(CacheKeyInviteList).Int() if int64(lastCost) < int64(cost.Seconds()) { cache.RedisClient.Set(CacheKeyInviteListCosts, int64(cost.Seconds()), 0) } return } func (d *cacheInviteList) GetCache() (allData []InviteUserType, err error) { cacheInviteLocker.Lock() defer cacheInviteLocker.Unlock() value := cache.RedisClient.Get(CacheKeyInviteList) if value.Err() != nil { err = value.Err() return } var dataBytes []byte err = value.Scan(&dataBytes) if err != nil { return } err = json.Unmarshal(dataBytes, &allData) if err != nil { return } return }