go-common/app/interface/main/creative/service/newcomer/service.go
2019-04-22 18:49:16 +08:00

441 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}