123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- package bws
- import (
- "context"
- "time"
- bwsmdl "go-common/app/interface/main/activity/model/bws"
- suitmdl "go-common/app/service/main/usersuit/model"
- "go-common/library/ecode"
- "go-common/library/log"
- xtime "go-common/library/time"
- )
- // Award achievement award
- func (s *Service) Award(c context.Context, loginMid int64, p *bwsmdl.ParamAward) (err error) {
- var (
- userAchieves []*bwsmdl.UserAchieve
- userAward int64 = -1
- )
- if _, ok := s.awardMids[loginMid]; !ok {
- err = ecode.ActivityNotAwardAdmin
- return
- }
- if p.Key == "" {
- if p.Key, err = s.midToKey(c, p.Mid); err != nil {
- return
- }
- }
- if userAchieves, err = s.dao.UserAchieves(c, p.Bid, p.Key); err != nil {
- err = ecode.ActivityAchieveFail
- return
- }
- if len(userAchieves) == 0 {
- err = ecode.ActivityNoAchieve
- return
- }
- for _, v := range userAchieves {
- if v.Aid == p.Aid {
- userAward = v.Award
- break
- }
- }
- if userAward == -1 {
- err = ecode.ActivityNoAchieve
- return
- } else if userAward == _noAward {
- err = ecode.ActivityNoAward
- return
- } else if userAward == _awardAlready {
- err = ecode.ActivityAwardAlready
- return
- }
- if err = s.dao.Award(c, p.Key, p.Aid); err != nil {
- log.Error("s.dao.Award key(%s) error(%v)", p.Key, err)
- }
- s.dao.DelCacheUserAchieves(c, p.Bid, p.Key)
- return
- }
- // Achievements achievements list
- func (s *Service) Achievements(c context.Context, p *bwsmdl.ParamID) (rs *bwsmdl.Achievements, err error) {
- var mapCnt map[int64]int64
- if rs, err = s.dao.Achievements(c, p.Bid); err != nil || rs == nil || len(rs.Achievements) == 0 {
- log.Error("s.dao.Achievements error(%v)", err)
- err = ecode.ActivityAchieveFail
- return
- }
- if mapCnt, err = s.countAchieves(c, p.Bid, p.Day); err != nil || len(mapCnt) == 0 {
- err = nil
- return
- }
- for _, achieve := range rs.Achievements {
- achieve.UserCount = mapCnt[achieve.ID]
- }
- return
- }
- func (s *Service) countAchieves(c context.Context, bid int64, day string) (rs map[int64]int64, err error) {
- var countAchieves []*bwsmdl.CountAchieves
- if day == "" {
- day = today()
- }
- if countAchieves, err = s.dao.AchieveCounts(c, bid, day); err != nil {
- log.Error("s.dao.RawCountAchieves error(%v)", err)
- return
- }
- rs = make(map[int64]int64, len(countAchieves))
- for _, countAchieve := range countAchieves {
- rs[countAchieve.Aid] = countAchieve.Count
- }
- return
- }
- // Achievement Achievement
- func (s *Service) Achievement(c context.Context, p *bwsmdl.ParamID) (rs *bwsmdl.Achievement, err error) {
- var (
- achieves *bwsmdl.Achievements
- )
- if achieves, err = s.dao.Achievements(c, p.Bid); err != nil || achieves == nil || len(achieves.Achievements) == 0 {
- log.Error("s.dao.Achievements error(%v)", err)
- err = ecode.ActivityAchieveFail
- return
- }
- for _, Achievement := range achieves.Achievements {
- if Achievement.ID == p.ID {
- rs = Achievement
- break
- }
- }
- if rs == nil {
- err = ecode.ActivityIDNotExists
- }
- return
- }
- func (s *Service) userAchieves(c context.Context, bid int64, key string) (res []*bwsmdl.UserAchieveDetail, err error) {
- var (
- usAchieves []*bwsmdl.UserAchieve
- achieves *bwsmdl.Achievements
- )
- if usAchieves, err = s.dao.UserAchieves(c, bid, key); err != nil {
- err = ecode.ActivityUserAchieveFail
- return
- }
- if len(usAchieves) == 0 {
- return
- }
- if achieves, err = s.dao.Achievements(c, bid); err != nil || achieves == nil || len(achieves.Achievements) == 0 {
- err = ecode.ActivityAchieveFail
- return
- }
- achievesMap := make(map[int64]*bwsmdl.Achievement, len(achieves.Achievements))
- for _, v := range achieves.Achievements {
- achievesMap[v.ID] = v
- }
- for _, v := range usAchieves {
- detail := &bwsmdl.UserAchieveDetail{UserAchieve: v}
- if achieve, ok := achievesMap[v.Aid]; ok {
- detail.Name = achieve.Name
- detail.Icon = achieve.Icon
- detail.Dic = achieve.Dic
- detail.LockType = achieve.LockType
- detail.Unlock = achieve.Unlock
- detail.Bid = achieve.Bid
- detail.IconBig = achieve.IconBig
- detail.IconActive = achieve.IconActive
- detail.IconActiveBig = achieve.IconActiveBig
- detail.SuitID = achieve.SuitID
- }
- res = append(res, detail)
- }
- return
- }
- func (s *Service) addAchieve(c context.Context, mid int64, achieve *bwsmdl.Achievement, key string) (err error) {
- var uaID int64
- if uaID, err = s.dao.AddUserAchieve(c, achieve.Bid, achieve.ID, achieve.Award, key); err != nil {
- err = ecode.ActivityAddAchieveFail
- return
- }
- if err = s.dao.AppendUserAchievesCache(c, achieve.Bid, key, &bwsmdl.UserAchieve{ID: uaID, Aid: achieve.ID, Award: achieve.Award, Ctime: xtime.Time(time.Now().Unix())}); err != nil {
- return
- }
- s.cache.Do(c, func(c context.Context) {
- s.dao.IncrCacheAchieveCounts(c, achieve.Bid, achieve.ID, today())
- var (
- keyID int64
- e error
- )
- if mid == 0 {
- if mid, keyID, e = s.keyToMid(c, key); e != nil || mid == 0 {
- log.Warn("Lottery keyID(%d) key(%s) error(%v)", keyID, key, e)
- }
- }
- if mid > 0 {
- if achieve.SuitID > 0 {
- arg := &suitmdl.ArgGrantByMids{Mids: []int64{mid}, Pid: achieve.SuitID, Expire: s.c.Rule.BwsSuitExpire}
- if e := s.suitRPC.GrantByMids(c, arg); e != nil {
- log.Error("addAchieve s.suit.GrantByMids(%d,%d) error(%v)", mid, achieve.SuitID, e)
- }
- log.Warn("Suit mid(%d) suitID(%d)", mid, achieve.SuitID)
- }
- if _, ok := s.lotteryAids[achieve.ID]; ok {
- s.dao.AddLotteryMidCache(c, achieve.ID, mid)
- }
- }
- })
- return
- }
|