You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
2.7 KiB
Go

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