123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- package newcomer
- import (
- "context"
- "time"
- "go-common/app/interface/main/creative/conf"
- "go-common/app/interface/main/creative/dao/academy"
- "go-common/app/interface/main/creative/dao/account"
- "go-common/app/interface/main/creative/dao/archive"
- "go-common/app/interface/main/creative/dao/article"
- "go-common/app/interface/main/creative/dao/data"
- "go-common/app/interface/main/creative/dao/medal"
- "go-common/app/interface/main/creative/dao/newcomer"
- "go-common/app/interface/main/creative/dao/order"
- "go-common/app/interface/main/creative/dao/watermark"
- ncMDL "go-common/app/interface/main/creative/model/newcomer"
- "go-common/app/interface/main/creative/service"
- "go-common/library/conf/env"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "go-common/library/queue/databus/report"
- "sync"
- )
- //Service struct
- type Service struct {
- c *conf.Config
- newc *newcomer.Dao
- arc *archive.Dao
- art *article.Dao
- acc *account.Dao
- data *data.Dao
- aca *academy.Dao
- wm *watermark.Dao
- medal *medal.Dao
- order *order.Dao
- //reward
- RewardCache []*ncMDL.Reward
- RewardMapCache map[int64]*ncMDL.Reward
- RewardTyPIDMapCache map[int8]int64 //存储奖励 类型-分类id对应关系
- RewardPIDTyMapCache map[int64]int8 //存储奖励 分类id-类型对应关系
- //task
- TaskCache []*ncMDL.Task
- TaskMapCache map[int64]*ncMDL.Task
- TaskTypeMapCache map[int8][]*ncMDL.Task
- TaskRewardMapCache map[int64][]*ncMDL.TaskRewardEntity
- //taskgroup-reward
- TaskGroupRewardMapCache map[int64][]*ncMDL.TaskGroupReward
- //gift-reward
- GiftRewardMapCache map[int8][]*ncMDL.GiftReward
- //initiative check task
- checkTaskChan chan int64
- checkTaskQueue []int64
- checkTaskDone chan struct{}
- // task-group
- TaskGroupCache []*ncMDL.TaskGroupEntity
- TaskGroupMapCache map[int64]*ncMDL.TaskGroupEntity
- }
- //New get service
- func New(c *conf.Config, rpcdaos *service.RPCDaos) *Service {
- s := &Service{
- c: c,
- newc: newcomer.New(c),
- arc: rpcdaos.Arc,
- art: rpcdaos.Art,
- acc: rpcdaos.Acc,
- data: data.New(c),
- aca: academy.New(c),
- wm: watermark.New(c),
- medal: medal.New(c),
- order: order.New(c),
- checkTaskChan: make(chan int64, 1000),
- checkTaskQueue: make([]int64, 0, 1000),
- checkTaskDone: make(chan struct{}),
- }
- s.loadRewards()
- s.loadTasks()
- s.loadTaskGroupRewards()
- s.loadGiftRewards()
- s.loadTaskRewards()
- s.loadTaskGroups()
- go s.loadProc()
- go s.checkTaskStateByMid()
- return s
- }
- // Ping service
- func (s *Service) Ping(c context.Context) (err error) {
- if err = s.newc.Ping(c); err != nil {
- log.Error("s.newc.Ping err(%v)", err)
- }
- return
- }
- // Close dao
- func (s *Service) Close() {
- s.newc.Close()
- s.checkTaskDone <- struct{}{}
- }
- // loadproc
- func (s *Service) loadProc() {
- for {
- time.Sleep(3 * time.Minute)
- s.loadRewards()
- s.loadTasks()
- s.loadTaskGroupRewards()
- s.loadGiftRewards()
- s.loadTaskRewards()
- s.loadTaskGroups()
- }
- }
- //load tags
- func (s *Service) loadRewards() {
- res, err := s.newc.Rewards(context.Background())
- if err != nil {
- log.Error("s.newc.Rewards error(%v)", err)
- return
- }
- if len(res) == 0 {
- return
- }
- s.RewardCache = res
- tempRewardMapCache := make(map[int64]*ncMDL.Reward)
- tempRewardTyPIDMapCache := make(map[int8]int64)
- tempRewardPIDTyMapCache := make(map[int64]int8)
- for _, v := range res {
- tempRewardMapCache[v.ID] = v
- if v.ParentID == 0 {
- tempRewardTyPIDMapCache[v.Type] = v.ID
- tempRewardPIDTyMapCache[v.ID] = v.Type
- }
- }
- s.RewardMapCache = tempRewardMapCache
- s.RewardTyPIDMapCache = tempRewardTyPIDMapCache
- s.RewardPIDTyMapCache = tempRewardPIDTyMapCache
- }
- //load tags
- func (s *Service) loadTasks() {
- res, err := s.newc.Tasks(context.Background())
- if err != nil {
- log.Error("s.newc.Tasks error(%v)", err)
- return
- }
- if len(res) == 0 {
- return
- }
- s.TaskCache = res
- temp := make(map[int64]*ncMDL.Task)
- tempMap := make(map[int8][]*ncMDL.Task)
- for _, v := range res {
- temp[v.ID] = v
- switch v.Type {
- case ncMDL.NewcomerTaskType:
- tempMap[ncMDL.NewcomerTaskType] = append(tempMap[ncMDL.NewcomerTaskType], v)
- case ncMDL.AdvancedTaskType:
- tempMap[ncMDL.AdvancedTaskType] = append(tempMap[ncMDL.AdvancedTaskType], v)
- case ncMDL.MonthTaskType:
- tempMap[ncMDL.MonthTaskType] = append(tempMap[ncMDL.MonthTaskType], v)
- }
- }
- s.TaskMapCache = temp
- // 默认分类包含:新手与进阶任务
- tempMap[ncMDL.DefualtTaskType] = append(tempMap[ncMDL.DefualtTaskType], tempMap[ncMDL.NewcomerTaskType]...)
- tempMap[ncMDL.DefualtTaskType] = append(tempMap[ncMDL.DefualtTaskType], tempMap[ncMDL.AdvancedTaskType]...)
- s.TaskTypeMapCache = tempMap
- }
- // SendRewardReceiveLog for reward receive.
- func (s *Service) SendRewardReceiveLog(c context.Context, mid int64) (err error) {
- if env.DeployEnv == env.DeployEnvDev {
- return
- }
- uInfo := &report.UserInfo{
- Business: 141, //创作中心奖励领取行为日志业务ID
- Mid: mid,
- Type: 0, //0-激励计划奖品领取
- Oid: mid,
- Platform: "激励计划",
- Ctime: time.Now(),
- Action: "incentive_plan_reward_receive", //激励计划奖品领取
- Index: []interface{}{mid},
- IP: metadata.String(c, metadata.RemoteIP),
- }
- report.User(uInfo)
- log.Info("s.SendRewardReceiveLog mid(%d)|uInfo(%+v)", mid, uInfo)
- return
- }
- // SendPendantReceiveLog for reward receive.
- func (s *Service) SendPendantReceiveLog(c context.Context, mid int64) (err error) {
- if env.DeployEnv == env.DeployEnvDev {
- return
- }
- uInfo := &report.UserInfo{
- Business: 141, //创作中心奖励领取行为日志业务ID
- Mid: mid,
- Type: 1, //1-头像挂件奖品领取
- Oid: mid,
- Platform: "头像挂件",
- Ctime: time.Now(),
- Action: "pendant_reward_receive", //头像挂件奖品领取
- Index: []interface{}{mid},
- IP: metadata.String(c, metadata.RemoteIP),
- }
- report.User(uInfo)
- log.Info("s.SendPendantReceiveLog mid(%d)|uInfo(%+v)", mid, uInfo)
- return
- }
- //load gift-reward
- func (s *Service) loadGiftRewards() {
- res, err := s.newc.AllGiftRewards(context.Background())
- if err != nil {
- log.Error("s.newc.AllGiftRewards error(%v)", err)
- return
- }
- if len(res) == 0 {
- return
- }
- s.GiftRewardMapCache = res
- }
- //load taskgroup-reward
- func (s *Service) loadTaskGroupRewards() {
- res, err := s.newc.AllTaskGroupRewards(context.Background())
- if err != nil {
- log.Error("s.newc.AllTaskGroupRewards error(%v)", err)
- return
- }
- if len(res) == 0 {
- return
- }
- s.TaskGroupRewardMapCache = res
- }
- // checkTaskStateByMid read bindMid to check task state
- func (s *Service) checkTaskStateByMid() {
- ticker := time.NewTicker(time.Millisecond * 100)
- defer ticker.Stop()
- for {
- select {
- case id := <-s.checkTaskChan:
- s.checkTaskQueue = append(s.checkTaskQueue, id)
- case <-ticker.C:
- if len(s.checkTaskQueue) > 0 {
- mid := s.checkTaskQueue[0]
- s.checkTaskQueue = s.checkTaskQueue[1:]
- s.DriveStateByUser(context.Background(), mid)
- }
- case <-s.checkTaskDone:
- log.Info("checkTaskStateByMid close")
- return
- }
- }
- }
- // putCheckTask put mid to checkTaskQueue
- func (s *Service) putCheckTaskState(mid int64) {
- var wg sync.WaitGroup
- wg.Add(1)
- go func() {
- s.checkTaskChan <- mid
- wg.Done()
- }()
- wg.Wait()
- }
- //load task-group
- func (s *Service) loadTaskGroups() {
- res, err := s.newc.TaskGroups(context.Background())
- if err != nil {
- log.Error("s.newc.TaskGroups error(%v)", err)
- return
- }
- if len(res) == 0 {
- return
- }
- s.TaskGroupCache = res
- temp := make(map[int64]*ncMDL.TaskGroupEntity)
- for _, v := range res {
- temp[v.ID] = v
- }
- s.TaskGroupMapCache = temp
- }
- //load task-group
- func (s *Service) loadTaskRewards() {
- res, err := s.newc.TaskRewards(context.Background())
- if err != nil {
- log.Error("s.newc.TaskRewards error(%v)", err)
- return
- }
- if len(res) == 0 {
- return
- }
- s.TaskRewardMapCache = res
- }
- // getRewardsByTaskType get rewards by taskType
- func (s *Service) getRewardsByTaskType(taskType int8) (res []*ncMDL.Reward) {
- res = make([]*ncMDL.Reward, 0)
- gifts, ok := s.GiftRewardMapCache[taskType]
- if !ok || len(gifts) == 0 {
- return
- }
- for _, v := range gifts {
- if v == nil {
- continue
- }
- r, ok := s.RewardMapCache[v.RewardID]
- if !ok {
- continue
- }
- res = append(res, r)
- }
- return
- }
- // getRewardsByGroupID get reward by groupID
- func (s *Service) getRewardsByGroupID(groupID int64) []*ncMDL.Reward {
- rewards := make([]*ncMDL.Reward, 0)
- rs, ok := s.TaskGroupRewardMapCache[groupID]
- if !ok || len(rs) == 0 {
- log.Error("getRewardsByGroupID reward not exist groupID(%d)", groupID)
- return rewards
- }
- for _, r := range rs {
- if r == nil {
- continue
- }
- if rr, ok := s.RewardMapCache[r.RewardID]; ok {
- rewards = append(rewards, rr)
- }
- }
- return rewards
- }
- // getTaskByGroupID get tasks by groupID
- func (s *Service) getTasksByGroupID(groupID int64) (res []*ncMDL.Task) {
- res = make([]*ncMDL.Task, 0)
- for _, task := range s.TaskCache {
- if task == nil {
- continue
- }
- if _, ok := s.TaskGroupMapCache[task.GroupID]; !ok {
- continue
- }
- if task.GroupID == groupID && task.State == ncMDL.NormalState {
- res = append(res, task)
- }
- }
- return
- }
- // getTaskByType get tasks by type
- func (s *Service) getTasksByType(ty int8) (res []*ncMDL.Task) {
- res = make([]*ncMDL.Task, 0)
- for _, task := range s.TaskCache {
- if task == nil {
- continue
- }
- if _, ok := s.TaskGroupMapCache[task.GroupID]; !ok {
- continue
- }
- if task.Type == ty && task.State == ncMDL.NormalState {
- res = append(res, task)
- }
- }
- return
- }
- // getTasksInfo get tasks info by type
- func (s *Service) getTasksInfoByType(ts []*ncMDL.Task, ty int8) (res []*ncMDL.Task) {
- tsMap := make(map[int64]*ncMDL.Task)
- for _, t := range ts {
- if t == nil {
- continue
- }
- tsMap[t.ID] = t
- }
- tasks, ok := s.TaskTypeMapCache[ty]
- if !ok || len(tasks) == 0 {
- return
- }
- res = make([]*ncMDL.Task, 0, len(tasks))
- for _, v := range tasks {
- if v == nil || v.State != 0 { //-1-删除;0-正常;1-隐藏
- continue
- }
- if _, ok := s.TaskGroupMapCache[v.GroupID]; !ok { // check taskGroup
- continue
- }
- task := *v
- t, ok := tsMap[v.ID]
- if !ok {
- task.CompleteSate = ncMDL.TaskIncomplete
- } else {
- task.CompleteSate = t.CompleteSate
- }
- res = append(res, &task)
- }
- return
- }
- // isHiddenTaskType check taskType is hidden
- func (s *Service) isHiddenTaskType(ty int8) bool {
- tasks, ok := s.TaskTypeMapCache[ty]
- if !ok || len(tasks) == 0 {
- return true
- }
- for _, t := range tasks {
- if t == nil {
- continue
- }
- _, ok := s.TaskGroupMapCache[t.GroupID]
- if !ok {
- continue
- }
- if t.State == 0 {
- return false
- }
- }
- return true
- }
|