2019-04-22 02:59:20 +00:00

99 lines
2.6 KiB
Go

package share
import (
"context"
"strconv"
"time"
shamdl "go-common/app/interface/main/web-goblin/model/share"
accmdl "go-common/app/service/main/account/model"
suitmdl "go-common/app/service/main/usersuit/model"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
// Encourage share encourage.
func (s *Service) Encourage(c context.Context, mid int64) (res *shamdl.Encourage, err error) {
var (
mcShare map[string]int64
shares []*shamdl.Share
key string
info *accmdl.Info
gps []*suitmdl.GroupPendantList
shaPend []*shamdl.GroupPendant
group = errgroup.Group{}
)
group.Go(func() (e error) {
if info, e = s.accRPC.Info3(context.Background(), &accmdl.ArgMid{Mid: mid}); e != nil {
log.Error("s.accRPC.Info mid(%d) error(%v)", mid, e)
}
return
})
group.Go(func() (e error) {
if mcShare, e = s.dao.SharesCache(context.Background(), mid); e != nil {
log.Error("s.dao.SharesCache mid(%d) error(%v)", mid, e)
if shares, e = s.dao.Shares(context.Background(), mid); e != nil {
log.Error("s.dao.Shares mid(%d) error(%v)", mid, e)
return
}
count := len(shares)
if count > 0 {
mcShare = make(map[string]int64, count)
for _, share := range shares {
key = strconv.FormatInt(share.ShareDate, 10)
mcShare[key] = share.DayCount
}
s.cache.Save(func() {
expire := monthShare()
s.dao.SetSharesCache(context.Background(), expire, mid, mcShare)
})
}
}
return
})
group.Go(func() (e error) {
if gps, e = s.suit.GroupPendantMid(context.Background(), &suitmdl.ArgGPMID{MID: mid, GID: s.c.Rule.Gid}); e != nil {
log.Error("s.suit.GroupPendantMid mid(%d) error(%v)", mid, e)
}
return
})
group.Wait()
res = new(shamdl.Encourage)
if len(gps) > 0 {
for _, gp := range gps {
shaPend = append(shaPend, &shamdl.GroupPendant{NeedDays: s.Pendants[gp.ID], Pendant: gp})
}
}
if info == nil || info.Mid == 0 {
res.UserInfo = struct{}{}
} else {
res.UserInfo = info
}
days := int64(len(mcShare))
if days > 0 {
res.TodayShare = mcShare[time.Now().Format("20060102")]
res.ShareDays = int64(days)
}
if len(shaPend) == 0 {
res.Pendants = struct{}{}
} else {
res.Pendants = shaPend
}
return
}
func monthShare() int {
now := time.Now()
currentYear, currentMonth, _ := now.Date()
currentLocation := now.Location()
firstOfMonth := time.Date(currentYear, currentMonth, 1, 23, 59, 59, 0, currentLocation)
lastOfMonth := firstOfMonth.AddDate(0, 1, -1)
return int(lastOfMonth.Sub(now).Seconds())
}
func (s *Service) loadPendant() {
for _, p := range s.c.Pendants {
s.Pendants[p.Pid] = p.Level
}
}