You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.7 KiB
153 lines
3.7 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"sort" |
|
"time" |
|
|
|
"go-common/app/interface/main/growup/model" |
|
"go-common/library/log" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
const ( |
|
_canEnrol = iota // 未报名,可以报名 |
|
_hasEnrol // 已报名 |
|
_win // 中奖 |
|
_notEnrol // 不能报名 |
|
_enrolEnd // 报名已结束 |
|
) |
|
|
|
// ShowActivity show creative_activity |
|
func (s *Service) ShowActivity(c context.Context, mid, activityID int64) (ac *model.CActivity, err error) { |
|
ac, err = s.dao.GetActivity(c, activityID) |
|
if err != nil { |
|
log.Error("s.dao.GetActivity error(%v)", err) |
|
return |
|
} |
|
enrolNum, winNum, mids, upState, err := s.handleUpActivity(c, mid, activityID) |
|
if err != nil { |
|
log.Error("s.handleUpActivity error(%v)", err) |
|
return |
|
} |
|
// 当前时间是否可以展示 |
|
now := xtime.Time(time.Now().Unix()) |
|
if ac.UpdatePage == 1 && now >= ac.ProgressStart && now <= ac.ProgressEnd { |
|
ac.ProgressState = 1 |
|
ac.Enrollment = enrolNum |
|
ac.WinNum = winNum |
|
// 2: 中奖类型为排序型 |
|
if ac.WinType == 2 { |
|
ac.Ranking, err = s.getActUpInfo(c, mids) |
|
if err != nil { |
|
log.Error("s.getActUpInfo error(%v)", err) |
|
return |
|
} |
|
} |
|
} |
|
if !(ac.BonusQuery == 1 && now >= ac.BonusQueryStart && now <= ac.BonusQueryEnd) { |
|
ac.BonusQuery = 0 |
|
} |
|
// 获取up主当前状态 |
|
ac.SignUpState, err = s.getSignUpState(c, mid, upState, ac) |
|
if err != nil { |
|
log.Error("s.getSignUpState error(%v)", err) |
|
} |
|
return |
|
} |
|
|
|
// get mid name and face |
|
func (s *Service) getActUpInfo(c context.Context, mids []int64) (upInfos []*model.ActUpInfo, err error) { |
|
upInfoMap, err := s.dao.AccountInfos(c, mids) |
|
if err != nil { |
|
return |
|
} |
|
upInfos = make([]*model.ActUpInfo, len(upInfoMap)) |
|
for i := 0; i < len(mids); i++ { |
|
upInfos[i] = upInfoMap[mids[i]] |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) getSignUpState(c context.Context, mid int64, upState int, ac *model.CActivity) (signUpState int, err error) { |
|
now := xtime.Time(time.Now().Unix()) |
|
// 报名未开始,不能报名 |
|
if now < ac.SignUpStart { |
|
signUpState = _notEnrol |
|
return |
|
} |
|
// 报名已结束并且未中奖 |
|
if now > ac.SignUpEnd && upState != _win { |
|
upState = _enrolEnd |
|
} |
|
// 已报名 |
|
if upState >= _hasEnrol { |
|
signUpState = upState |
|
return |
|
} |
|
|
|
// 签约结束时间 >= 报名结束时间, 任何人都可以报名 |
|
if ac.SignedEnd >= ac.SignUpEnd { |
|
signUpState = _canEnrol |
|
} else { |
|
var signedAt xtime.Time |
|
signedAt, err = s.dao.GetUpSignedAt(c, "up_info_video", mid) |
|
if err != nil { |
|
return |
|
} |
|
if signedAt >= ac.SignedStart && signedAt <= ac.SignedEnd { |
|
signUpState = _canEnrol |
|
} else { |
|
signUpState = _notEnrol |
|
} |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) handleUpActivity(c context.Context, mid, activityID int64) (enrol, win int, mids []int64, upState int, err error) { |
|
ups, err := s.dao.ListUpActivity(c, activityID) |
|
if err != nil { |
|
return |
|
} |
|
sort.Slice(ups, func(i, j int) bool { |
|
return ups[i].Rank < ups[j].Rank |
|
}) |
|
mids = make([]int64, 0) |
|
for _, up := range ups { |
|
if up.State >= _win { |
|
win++ |
|
enrol++ |
|
mids = append(mids, up.MID) |
|
} else if up.State == _hasEnrol { |
|
enrol++ |
|
} |
|
if up.MID == mid { |
|
upState = up.State |
|
// 已发奖 |
|
if upState == 3 { |
|
upState = 2 |
|
} |
|
} |
|
} |
|
return |
|
} |
|
|
|
// SignUpActivity up sign up activity |
|
func (s *Service) SignUpActivity(c context.Context, mid, activityID int64) (err error) { |
|
nickname, _, err := s.dao.CategoryInfo(c, mid) |
|
if err != nil { |
|
log.Error("s.dao.CategoryInfo error(%v)", err) |
|
return |
|
} |
|
upBonus := &model.UpBonus{ |
|
MID: mid, |
|
ActivityID: activityID, |
|
Nickname: nickname, |
|
State: 1, |
|
SignUpTime: xtime.Time(time.Now().Unix()), |
|
} |
|
if _, err = s.dao.SignUpActivity(c, upBonus); err != nil { |
|
log.Error("s.dao.SignUpActivity error(%v)", err) |
|
} |
|
return |
|
}
|
|
|