123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- package service
- import (
- "context"
- "fmt"
- "sort"
- "time"
- "go-common/app/interface/main/growup/model"
- "go-common/library/ecode"
- "go-common/library/log"
- xtime "go-common/library/time"
- )
- const (
- ceilings = 50000
- rule = 1
- detail = 3
- question = 5
- answer = 6
- )
- // GetAwardUpStatus get award up status
- func (s *Service) GetAwardUpStatus(c context.Context, awardID, mid int64) (status *model.AwardUpStatus, err error) {
- joined, err := s.isJoined(c, mid, awardID)
- if err != nil {
- return
- }
- fans, err := s.getUpFans(c, mid)
- if err != nil {
- return
- }
- status = &model.AwardUpStatus{
- Joined: joined,
- Qualified: checkQualification(fans),
- }
- return
- }
- // GetWinningRecord get winning record
- func (s *Service) GetWinningRecord(c context.Context, mid int64) (rs []*model.WinningRecord, err error) {
- awardIDs, err := s.dao.GetAwardJoinRecord(c, mid)
- if err != nil {
- return
- }
- if len(awardIDs) == 0 {
- return
- }
- as := make([]int64, 0)
- for awardID := range awardIDs {
- as = append(as, awardID)
- }
- awards, err := s.dao.JoinedSpecialAwards(c, as)
- if err != nil {
- return
- }
- sort.Slice(awards, func(i, j int) bool {
- return awards[i].CycleStart < awards[j].CycleStart
- })
- // am map[award_id]prize_id
- am, err := s.dao.AwardIDsByWinner(c, mid)
- if err != nil {
- return
- }
- now := time.Now().Unix()
- rs = make([]*model.WinningRecord, 0)
- for _, award := range awards {
- // in selection
- if now > int64(award.CycleEnd) && award.OpenStatus == 1 {
- rs = append(rs, &model.WinningRecord{
- AwardID: award.AwardID,
- AwardName: award.AwardName,
- State: 2,
- })
- continue
- }
- // finished
- if award.OpenStatus == 2 {
- wr := &model.WinningRecord{
- AwardID: award.AwardID,
- AwardName: award.AwardName,
- }
- if prizeID, ok := am[award.AwardID]; ok {
- wr.PrizeID = prizeID
- wr.State = 1
- }
- rs = append(rs, wr)
- }
- }
- return
- }
- // GetWinningPoster get prize winning poster
- func (s *Service) GetWinningPoster(c context.Context, mid int64, awardID, prizeID int64) (poster *model.Poster, err error) {
- accs, err := s.dao.AccountInfos(c, []int64{mid})
- if err != nil {
- return
- }
- if len(accs) <= 0 {
- return
- }
- award, err := s.dao.GetAwardSchedule(c, awardID)
- if err != nil {
- return
- }
- // am map[award_id]division_name
- names, err := s.dao.DivisionName(c, mid)
- if err != nil {
- return
- }
- bonus, err := s.dao.AwardBonus(c, awardID, prizeID)
- if err != nil {
- return
- }
- poster = &model.Poster{
- AwardName: award.AwardName,
- Nickname: accs[mid].Nickname,
- Face: accs[mid].Face,
- PrizeName: fmt.Sprintf("最佳%s新秀奖", names[awardID]),
- Date: award.CycleEnd.Time().Format("2006-01"),
- Bonus: bonus,
- }
- return
- }
- // JoinAward sign up award
- func (s *Service) JoinAward(c context.Context, mid int64, awardID int64) (err error) {
- joined, err := s.isJoined(c, mid, awardID)
- if err != nil {
- return
- }
- if joined {
- err = ecode.GrowupSpecialAwardJoined
- return
- }
- fans, err := s.getUpFans(c, mid)
- if err != nil {
- return
- }
- if !checkQualification(fans) {
- err = ecode.GrowupSpecialAwardUnqualified
- return
- }
- _, err = s.dao.AddToAwardRecord(c, mid, awardID)
- return
- }
- // if fans count >= ceilings, no qualification
- func checkQualification(fans int64) bool {
- return fans < ceilings
- }
- // if joined special award
- func (s *Service) isJoined(c context.Context, mid, awardID int64) (joined bool, err error) {
- count, err := s.dao.JoinedCount(c, mid, awardID)
- if err != nil {
- return
- }
- joined = count != 0
- return
- }
- // AwardList award_id: award_name
- func (s *Service) AwardList(c context.Context) (as []*model.SimpleSpecialAward, err error) {
- as, err = s.dao.PastAwards(c)
- if err != nil {
- return
- }
- sort.Slice(as, func(i, j int) bool {
- return as[i].CycleStart < as[j].CycleStart
- })
- return
- }
- // Winners get winners by award id
- func (s *Service) Winners(c context.Context, awardID int64) (as []*model.Account, err error) {
- mids, err := s.dao.GetWinners(c, awardID)
- if err != nil {
- return
- }
- infos, err := s.dao.AccountInfos(c, mids)
- if err != nil {
- return
- }
- for _, mid := range mids {
- a := &model.Account{Mid: mid}
- as = append(as, a)
- if info, ok := infos[mid]; ok {
- a.Name = info.Nickname
- a.Face = info.Face
- }
- }
- return
- }
- // AwardDetail get award detail include schedule & resource
- func (s *Service) AwardDetail(c context.Context, awardID int64) (data map[string]interface{}, err error) {
- schedule, err := s.dao.GetAwardSchedule(c, awardID)
- if err != nil {
- return
- }
- // rs map[resource_type]map[index]content
- rs, err := s.dao.GetResources(c, awardID)
- if err != nil {
- return
- }
- qas := make([]*model.QA, len(rs[question]))
- for i := 0; i < len(rs[question]); i++ {
- qas[i] = &model.QA{}
- }
- res := map[string]interface{}{
- "qa": qas,
- "rule": "",
- "detail": "",
- }
- for rt, cs := range rs {
- if rt == rule {
- res["rule"] = cs[1]
- }
- if rt == detail {
- res["detail"] = cs[1]
- }
- if rt == question || rt == answer {
- for index, content := range cs {
- if index < 0 || index > len(qas) {
- continue
- }
- qa := qas[index-1]
- if rt == question {
- qa.Question = content
- }
- if rt == answer {
- qa.Answer = content
- }
- }
- }
- }
- data = map[string]interface{}{
- "schedule": schedule,
- "resource": res,
- }
- return
- }
- // SpecialAwardInfo special award info
- func (s *Service) SpecialAwardInfo(c context.Context, mid int64) (data map[string]interface{}, err error) {
- var (
- nowTime = xtime.Time(time.Now().Unix())
- winRecord []string
- upStates []*model.UpAwardState
- )
- awards, nowAward, nextAward, err := s.getRecentSpecialAward(c, nowTime)
- if err != nil {
- log.Error("s.getRecentSpecialAward error(%v)", err)
- return
- }
- if mid > 0 {
- winRecord, err = s.getAwardWinRecord(c, mid, awards)
- if err != nil {
- log.Error("s.getAwardWinRecord error(%v)", err)
- return
- }
- upStates, err = s.getUpAwardState(c, mid, awards)
- if err != nil {
- log.Error("s.getUpAwardState error(%v)", err)
- return
- }
- }
- data = map[string]interface{}{
- "win_record": winRecord,
- "now": nowAward,
- "next": nextAward,
- "up_states": upStates,
- }
- return
- }
- // get now and next special award
- func (s *Service) getRecentSpecialAward(c context.Context, nowTime xtime.Time) (awards []*model.SpecialAward, nowAward, nextAward *model.SpecialAward, err error) {
- awards, err = s.dao.GetSpecialAwards(c)
- if err != nil {
- log.Error("s.dao.GetSpecialAwards error(%v)", err)
- return
- }
- sort.Slice(awards, func(i, j int) bool {
- return awards[i].CycleStart < awards[j].CycleStart
- })
- for i := 0; i < len(awards); i++ {
- if awards[i].CycleStart <= nowTime && awards[i].CycleEnd >= nowTime {
- nowAward = awards[i]
- } else if awards[i].CycleStart > nowTime {
- nextAward = awards[i]
- break
- }
- }
- if nowAward != nil {
- nowAward.Duration = int64(nowAward.CycleEnd - nowTime)
- nowAward.Divisions, err = s.dao.GetSpecialAwardDivision(c, nowAward.AwardID)
- if err != nil {
- return
- }
- }
- if nextAward != nil {
- nextAward.Duration = int64(nextAward.CycleStart - nowTime)
- nextAward.Divisions, err = s.dao.GetSpecialAwardDivision(c, nextAward.AwardID)
- if err != nil {
- return
- }
- }
- return
- }
- func (s *Service) getAwardWinRecord(c context.Context, mid int64, awards []*model.SpecialAward) (awardNames []string, err error) {
- awardIDs, err := s.dao.GetAwardWinRecord(c, mid)
- if err != nil {
- log.Error("s.dao.GetAwardWinRecord error(%v)", err)
- return
- }
- awardNames = make([]string, 0)
- for i := len(awards) - 1; i >= 0; i-- {
- if awardIDs[awards[i].AwardID] {
- awardNames = append(awardNames, awards[i].AwardName)
- }
- }
- return
- }
- func (s *Service) getUpAwardState(c context.Context, mid int64, awards []*model.SpecialAward) (upStates []*model.UpAwardState, err error) {
- upStates = make([]*model.UpAwardState, 0)
- now := xtime.Time(time.Now().Unix())
- awardIDs, err := s.dao.GetAwardJoinRecord(c, mid)
- if err != nil {
- log.Error("s.dao.GetAwardJoinRecord error(%v)", err)
- return
- }
- winIDs, err := s.dao.GetAwardWinRecord(c, mid)
- if err != nil {
- log.Error("s.dao.GetAwardWinRecord error(%v)", err)
- return
- }
- for i := 0; i < len(awards); i++ {
- upState := &model.UpAwardState{AwardName: awards[i].AwardName}
- date := awards[i].AnnounceDate.Time()
- doubleCreativeStart := time.Date(date.Year(), date.Month()+1, 15, 0, 0, 0, 0, time.Local)
- doubleCreativeEnd := doubleCreativeStart.AddDate(0, 0, 14)
- if now > awards[i].CycleEnd && now <= awards[i].AnnounceDate && awardIDs[awards[i].AwardID] { // 评选中
- upState.State = 1
- } else if now > awards[i].AnnounceDate && now < xtime.Time(doubleCreativeStart.Unix()) && winIDs[awards[i].AwardID] { // 双倍即将开始
- upState.State = 2
- } else if now >= xtime.Time(doubleCreativeStart.Unix()) && now <= xtime.Time(doubleCreativeEnd.Unix()) && winIDs[awards[i].AwardID] { // 双倍中
- upState.State = 3
- }
- if upState.State != 0 {
- upStates = append(upStates, upState)
- }
- }
- return
- }
|