package provider import ( "context" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/utils/merr" "joybuywork/internal/utils/timez" "time" ) type CampaignTZ struct { ctx context.Context be *merr.BusinessError cpn *model.FissionCampaign langMark string tOffset int32 start, end, pre int64 } // NewCampaignTZ 活动控制器 func NewCampaignTZ(ctx context.Context, cpn *model.FissionCampaign, langMark string) *CampaignTZ { ct := &CampaignTZ{ ctx: ctx, be: merr.NewBE(ctx), cpn: cpn, langMark: langMark, } ct.tz() return ct } // GetStatus 获取活动状态 func (s *CampaignTZ) GetStatus() int32 { if s.IsWait() { return mtype.FissionCampaignStatusWait } if s.IsPre() { return mtype.FissionCampaignStatusPubPre } if s.IsRunning() { return mtype.FissionCampaignStatusPub } return mtype.FissionCampaignStatusCancel } // GetTz 获取活动时区 func (s *CampaignTZ) GetTz() int32 { return s.tOffset } // IsWait 活动等待开始 func (s *CampaignTZ) IsWait() bool { return time.Now().Unix() < s.start } // IsRunning IsStart 活动进行中 func (s *CampaignTZ) IsRunning() bool { return time.Now().Unix() > s.start && time.Now().Unix() < s.end } // IsEnd 活动是否结束 func (s *CampaignTZ) IsEnd() bool { return time.Now().Unix() > s.end } // IsPre 活动是否在予发布期间 func (s *CampaignTZ) IsPre() bool { if s.pre > 0 { return time.Now().Unix() < s.pre } return s.cpn.Status == mtype.FissionCampaignStatusPubPre } // EndTime 结束时间处理成设置好时区的标准时间 func (s *CampaignTZ) EndTime() time.Time { return time.Unix(s.end, 0).In(timez.Location(s.tOffset)) } // StarTime 开始时间处理成设置好时区的标准时间 func (s *CampaignTZ) StarTime() time.Time { return time.Unix(s.start, 0).In(timez.Location(s.tOffset)) } // 时区处理 func (s *CampaignTZ) tz() { s.tOffset = s.cpn.TOffset s.start = s.cpn.StartTime s.end = s.cpn.EndTime s.pre = s.cpn.PreToRun lms := s.cpn.GetLangMarks() if len(lms) <= 1 || s.langMark == "" { return } var uLang string for _, lm := range lms[1:] { if lm == s.langMark { uLang = lm break } } if uLang == "" { return } lang, _ := cache.NewCampaignLang(s.ctx).FindByCampaignId(s.cpn.ID, uLang) if lang == nil { return } s.tOffset = lang.TOffset s.start = timez.GMT(s.cpn.TStart, lang.TOffset) s.end = timez.GMT(s.cpn.TEnd, lang.TOffset) if s.cpn.PreToRun > 0 { preTime := timez.GMTTime(s.cpn.TOffset, s.cpn.PreToRun) preDateTime := preTime.Format(time.DateTime) langPre, _ := time.ParseInLocation(time.DateTime, preDateTime, timez.Location(lang.TOffset)) s.pre = langPre.Unix() } }