Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["service_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/main/creative/conf:go_default_library",
"//app/interface/main/creative/service:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"h5.go",
"service.go",
"state.go",
"task.go",
],
importpath = "go-common/app/interface/main/creative/service/newcomer",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/creative/conf:go_default_library",
"//app/interface/main/creative/dao/academy:go_default_library",
"//app/interface/main/creative/dao/account:go_default_library",
"//app/interface/main/creative/dao/archive:go_default_library",
"//app/interface/main/creative/dao/article:go_default_library",
"//app/interface/main/creative/dao/data:go_default_library",
"//app/interface/main/creative/dao/medal:go_default_library",
"//app/interface/main/creative/dao/newcomer:go_default_library",
"//app/interface/main/creative/dao/order:go_default_library",
"//app/interface/main/creative/dao/watermark:go_default_library",
"//app/interface/main/creative/model/newcomer:go_default_library",
"//app/interface/main/creative/service:go_default_library",
"//app/service/main/account/api:go_default_library",
"//library/conf/env:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata:go_default_library",
"//library/queue/databus/report:go_default_library",
"//library/sync/errgroup.v2:go_default_library",
"//library/time:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,152 @@
package newcomer
import (
"context"
"fmt"
"go-common/app/interface/main/creative/model/newcomer"
"go-common/library/ecode"
"go-common/library/log"
)
// H5TaskList for H5 detail task list
func (s *Service) H5TaskList(c context.Context, mid int64, from string) (res *newcomer.H5TaskRewardList, err error) {
var (
u *UserTaskInfo
tasks []*newcomer.Task
taskTypeMap = make(map[int8][]*newcomer.Task) // taskType-task
taskGroupMap = make(map[int64][]*newcomer.Task) // groupID-task
)
// get user tasks
userTasks, err := s.newc.UserTasks(c, mid)
if err != nil {
log.Error("TaskList s.newc.UserTasks mid(%d)|error(%v)", mid, err)
return
}
if len(userTasks) == 0 {
// returnUser did not receive the task
res = &newcomer.H5TaskRewardList{
TaskReceived: newcomer.NoBindTask,
}
return
}
// get user info
u, err = s.getUserTaskInfo(c, mid, userTasks)
if err != nil {
return
}
// get tasks
tasks = s.getTasksInfoByType(userTasks, newcomer.DefualtTaskType)
if len(tasks) == 0 {
err = ecode.CreativeNewcomerNoTask
log.Error("TaskList s.GetTaskByType len(tasks) == 0")
return
}
// group by groupID & taskType
taskGroupMap, taskTypeMap = s.groupByTasks(tasks)
// add task label & redirect
s.addLabelRedirect(tasks, from)
// task_gift
taskGift, err := s.getTaskGiftData(c, mid, taskTypeMap, newcomer.FromH5)
if err != nil {
return
}
// task_groups
tgs, err := s.getTaskGroupData(c, mid, taskGroupMap)
if err != nil {
return
}
// if userLevel == UserTaskLevel01 , set unlock state
if u.UserTaskLevel == newcomer.UserTaskLevel01 {
for _, v := range tgs {
if v.TaskType == newcomer.AdvancedTaskType {
v.RewardState = newcomer.RewardUnlock
}
}
}
// add tips
s.addTaskGroupTip(tgs)
s.addGiftTip(taskGift, taskTypeMap)
res = &newcomer.H5TaskRewardList{
TaskReceived: newcomer.BindTask,
TaskGroups: tgs,
TaskGift: taskGift,
}
return
}
// addLabelRedirect add label & redirect
func (s *Service) addLabelRedirect(tasks []*newcomer.Task, from string) {
if len(tasks) == 0 {
return
}
for _, v := range tasks {
if v == nil {
continue
}
t, ok := s.TaskMapCache[v.ID]
if !ok {
continue
}
m, ook := newcomer.H5RedirectMap[from][t.TargetType]
if !ook || len(m) == 0 {
continue
}
v.Label = m[0]
v.Redirect = m[1]
}
}
// addGiftTip get gift tip
func (s *Service) addGiftTip(tg []*newcomer.TaskGift, kindMap map[int8][]*newcomer.Task) {
for _, v := range tg {
if v == nil {
continue
}
if v.State != newcomer.RewardUnlock {
if tip, ok := newcomer.GiftTipMap[v.State][v.Type]; ok {
v.Tip = tip
} else {
v.Tip = ""
}
continue
}
// 判断还需要完成奖几个任务
if len(kindMap[v.Type]) == 0 {
v.Tip = ""
continue
}
unfinished := 0
for _, v := range kindMap[v.Type] {
if v == nil {
continue
}
if v.CompleteSate == newcomer.TaskIncomplete {
unfinished++
}
}
v.Tip = fmt.Sprintf("再完成%d个任务就能领取了呢", unfinished)
}
}
// addTaskGroupTip get taskGroup tip
func (s *Service) addTaskGroupTip(tr []*newcomer.TaskRewardGroup) {
for _, v := range tr {
if v == nil {
continue
}
if tip, ok := newcomer.TaskGroupTipMap[v.RewardState][v.GroupID]; ok {
v.Tip = tip
} else {
v.Tip = ""
}
}
}

View File

@@ -0,0 +1,440 @@
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
}

View File

@@ -0,0 +1,26 @@
package newcomer
import (
"flag"
"os"
"testing"
"go-common/app/interface/main/creative/conf"
"go-common/app/interface/main/creative/service"
)
var (
s *Service
)
func TestMain(m *testing.M) {
flag.Set("conf", "../../cmd/creative.toml")
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
rpcdaos := service.NewRPCDaos(conf.Conf)
s = New(conf.Conf, rpcdaos)
m.Run()
os.Exit(m.Run())
}

View File

@@ -0,0 +1,626 @@
package newcomer
import (
"context"
"strconv"
"time"
"go-common/app/interface/main/creative/model/newcomer"
"go-common/library/log"
"go-common/library/sync/errgroup.v2"
)
//DriveStateByUser drive new hand & advanced task state
func (s *Service) DriveStateByUser(c context.Context, mid int64) {
res, err := s.newc.UserTasksByMID(c, mid)
if err != nil {
log.Error("DriveStateByUser s.newc.UserTasksByMID mid(%d)|err(%v)", mid, err)
return
}
if len(res) == 0 {
return
}
for _, v := range res {
if s.CheckTaskState(context.Background(), &newcomer.CheckTaskStateReq{MID: v.MID, TaskID: v.TaskID}) {
_, err := s.newc.UpUserTask(c, v.MID, v.TaskID)
if err != nil {
log.Error("DriveStateByUser s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", v.MID, v.TaskID, err)
}
}
}
}
//CheckTaskState check task state by mid & task id
func (s *Service) CheckTaskState(c context.Context, req *newcomer.CheckTaskStateReq) (state bool) {
if req == nil {
return
}
mid, tid := req.MID, req.TaskID
if _, ok := s.TaskMapCache[tid]; !ok {
return
}
task := s.TaskMapCache[tid]
//log.Info("CheckTaskState req(%+v)|task(%+v)", req, task)
switch task.TargetType {
case newcomer.TargetType001, newcomer.TargetType014: //新手任务-1 该UID下开放浏览的稿件≥1 / 进阶任务- 14 该UID下开放浏览的稿件≥5
cnt, err := s.arc.UpCount(c, mid)
if err != nil {
log.Error("CheckTaskState s.arc.UpCount mid(%d)|error(%v)", mid, err)
return
}
if cnt >= task.TargetValue {
switch task.TargetType {
case newcomer.TargetType001:
log.Info("CheckTaskState TargetType001 mid(%d)|count(%d)|指标:新手任务-1 该UID下开放浏览的稿件≥1", mid, cnt)
case newcomer.TargetType014:
log.Info("CheckTaskState TargetType014 mid(%d)|count(%d)|指标:进阶任务- 14 该UID下开放浏览的稿件≥5", mid, cnt)
}
state = true
}
case newcomer.TargetType002: //该UID分享自己视频的次数≥1
case newcomer.TargetType003: //该UID在创作学院的观看记录≥1
cnt, err := s.aca.PlayCount(c, mid)
if err != nil {
log.Error("s.aca.PlayCount error(%v)", err)
return
}
if cnt >= task.TargetValue {
log.Info("CheckTaskState TargetType003 mid(%d)|count(%d)|指标:新手任务-1 该UID在创作学院的观看记录≥1", mid, cnt)
state = true
}
case newcomer.TargetType004, newcomer.TargetType005, newcomer.TargetType006, newcomer.TargetType007, newcomer.TargetType008, newcomer.TargetType009: //该UID下所有avid的获得评论数/...≥3/5
state = s.totalStat(c, mid, int64(task.TargetValue), task.TargetType)
case newcomer.TargetType010, newcomer.TargetType022: //新手任务- 10 获得10个粉丝 / 进阶任务- 22 该UID的粉丝数≥1000
pl, err := s.acc.ProfileWithStat(c, mid)
if err != nil {
log.Error("CheckTaskState s.acc.ProfileWithStat error(%v)", err)
return
}
if pl == nil {
return
}
if pl.Follower >= int64(task.TargetValue) {
switch task.TargetType {
case newcomer.TargetType010:
log.Info("CheckTaskState TargetType010 mid(%d)|follower(%d)|指标:新手任务-10 该UID的粉丝数≥10", mid, pl.Follower)
case newcomer.TargetType022:
log.Info("CheckTaskState TargetType022 mid(%d)|follower(%d)|指标:进阶任务-22 该UID的粉丝数≥1000", mid, pl.Follower)
}
state = true
}
case newcomer.TargetType011: //任务完成期间该UID的水印开关为打开状态
wm, err := s.wm.WaterMark(c, mid)
if err != nil {
log.Error("CheckTaskState s.wm.WaterMark mid(%d) error(%v)", mid, err)
return
}
if wm != nil && wm.State == 1 && wm.URL != "" {
log.Info("CheckTaskState TargetType011 mid(%d)已开启水印|指标:新手任务-11 任务完成期间该UID的水印开关为打开状态", mid)
state = true
}
case newcomer.TargetType012: //该UID的关注列表含有“哔哩哔哩创作中心”
fid := creatorMID //用户哔哩哔哩创作中心 mid
fl, err := s.acc.Relations(c, mid, []int64{fid}, "")
if err != nil {
log.Error("CheckTaskState s.acc.Relations mid(%d)|ip(%s)|error(%v)", mid, "", err)
return
}
if fl == nil {
return
}
if st, ok := fl[fid]; ok && (st == 6 || st == 2) {
log.Info("CheckTaskState TargetType012 mid(%d)已关注创作中心|指标:新手任务-12 该UID的关注列表含有“哔哩哔哩创作中心”", mid)
state = true
}
case newcomer.TargetType013, newcomer.TargetType015, newcomer.TargetType016, newcomer.TargetType017, newcomer.TargetType018, newcomer.TargetType019, newcomer.TargetType020, newcomer.TargetType021: //13-该UID通过手机投稿的稿件≥1 / 15-21单稿件获得1000播放...
state = s.singleStat(c, mid, int64(task.TargetValue), task.TargetType)
case newcomer.TargetType023: //该UID的激励计划状态为已开通
ac, err := s.order.GrowAccountState(c, mid, 0) //类型 0 视频 2 专栏 3 素材
if err != nil {
log.Error("CheckTaskState s.order.GrowUpPlan mid(%d) error(%v)", mid, err)
return
}
if ac == nil {
return
}
if ac.State == 3 { //账号状态; 1: 未申请; 2: 待审核; 3: 已签约; 4.已驳回; 5.主动退出; 6:被动退出; 7:封禁
log.Info("CheckTaskState TargetType023 mid(%d)已签约激励计划|指标:进阶任务-23 该UID的激励计划状态为已开通", mid)
state = true
}
case newcomer.TargetType024: //该UID粉丝勋章为开启状态
medal, err := s.medal.Medal(c, mid)
if err != nil {
log.Error("CheckTaskState s.medal.Medal mid(%d) error(%v)", mid, err)
return
}
if medal == nil {
return
}
status, err := strconv.Atoi(medal.Status)
if err != nil {
log.Error("CheckTaskState strconv.Atoi medal.Status(%s) error(%v)", medal.Status, err)
return
}
if status == 2 { //勋章审核状态 -1已拒绝 0未申请 1已申请 2已开通
log.Info("CheckTaskState TargetType024 mid(%d)已开通粉丝勋章|指标:进阶任务-24 该UID粉丝勋章为开启状态", mid)
state = true
}
}
return
}
func (s *Service) totalStat(c context.Context, mid, val int64, ty int8) (state bool) {
st, err := s.data.UpStat(c, mid, time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102"))
if err != nil || st == nil {
log.Error("totalStat s.data.NewStat mid(%d) st(%+v) error(%v) ", mid, st, err)
return
}
switch ty {
case newcomer.TargetType004:
if st.Reply >= val {
log.Info("CheckTaskState TargetType004 mid(%d)|v(%+v)|指标:新手任务-4 该UID下所有avid的获得评论数≥3", mid, st.Reply)
state = true
}
case newcomer.TargetType005:
if st.Share >= val {
log.Info("CheckTaskState TargetType005 mid(%d)|v(%+v)|指标:新手任务-5 该UID下所有avid获得分享数≥3", mid, st.Share)
state = true
}
case newcomer.TargetType006:
if st.Fav >= val {
log.Info("CheckTaskState TargetType006 mid(%d)|v(%+v)|指标:新手任务-6 该UID的所有avid的获得收藏数≥5", mid, st.Fav)
state = true
}
case newcomer.TargetType007:
if st.Coin >= val {
log.Info("CheckTaskState TargetType007 mid(%d)|v(%+v)|指标:新手任务-7 该UID下所有avid的获得硬币数≥5", mid, st.Coin)
state = true
}
case newcomer.TargetType008:
if st.Like >= val {
log.Info("CheckTaskState TargetType008 mid(%d)|v(%+v)|指标:新手任务-8 该UID下所有avid获得点赞数≥5", mid, st.Like)
state = true
}
case newcomer.TargetType009:
if st.Dm >= val {
log.Info("CheckTaskState TargetType009 mid(%d)|v(%+v)|指标:新手任务-9 该UID下所有avid的获得弹幕数≥5", mid, st.Dm)
state = true
}
}
return
}
func (s *Service) singleStat(c context.Context, mid, val int64, ty int8) (state bool) {
st, err := s.data.UpArchiveStatQuery(c, mid, time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102"))
if err != nil || st == nil {
log.Error("singleStat s.data.UpArchiveStatQuery mid(%d)|err(%v)", mid, err)
return
}
switch ty {
case newcomer.TargetType013:
if st.FromPhoneNum >= val {
log.Info("CheckTaskState TargetType013 mid(%d)|v(%+v)|指标:进阶任务-13 用手机投稿上传视频", mid, st.FromPhoneNum)
state = true
}
case newcomer.TargetType015:
if st.PlayV >= val {
log.Info("CheckTaskState TargetType015 mid(%d)|v(%+v)|指标:进阶任务-15 该UID下任意avid的获得点击量≥1000", mid, st.PlayV)
state = true
}
case newcomer.TargetType016:
if st.ReplyV >= val {
log.Info("CheckTaskState TargetType016 mid(%d)|v(%+v)|指标:进阶任务-16 该UID下任意avid的评论≥30", mid, st.ReplyV)
state = true
}
case newcomer.TargetType017:
if st.ShareV >= val {
log.Info("CheckTaskState TargetType017 mid(%d)|v(%+v)|指标:进阶任务-17 该UID下任意avid的获得分享数≥10", mid, st.ShareV)
state = true
}
case newcomer.TargetType018:
if st.FavV >= val {
log.Info("CheckTaskState TargetType018 mid(%d)|v(%+v)|指标:进阶任务-18 该UID下任意avid的获得收藏数≥30", mid, st.FavV)
state = true
}
case newcomer.TargetType019:
if st.CoinV >= val {
log.Info("CheckTaskState TargetType019 mid(%d)|v(%+v)|指标:进阶任务-19 该UID下任意avid的获得硬币数≥50", mid, st.CoinV)
state = true
}
case newcomer.TargetType020:
if st.LikeV >= val {
log.Info("CheckTaskState TargetType020 mid(%d)|v(%+v)|指标:进阶任务-20 该UID下任意avid的获得点赞数≥50", mid, st.LikeV)
state = true
}
case newcomer.TargetType021:
if st.DmV >= val {
log.Info("CheckTaskState TargetType021 mid(%d)|v(%+v)|指标:进阶任务-21 该UID下任意avid的获得弹幕数≥50", mid, st.DmV)
state = true
}
}
return
}
//syncCheckTaskStatus check task status
func (s *Service) syncCheckTaskStatus(c context.Context, mid int64, tasks []*newcomer.Task) {
log.Info("syncCheckTaskStatus mid(%d) | tasks count(%d)", mid, len(tasks))
tsm := getTaskSortMap(tasks)
if len(tsm) == 0 {
return
}
g := &errgroup.Group{}
for k := range tsm {
switch k {
case newcomer.ArcUpCount: //该UID下开放浏览的稿件数量
g.Go(func(context.Context) error {
s.arcUpCount(c, mid, tsm[newcomer.ArcUpCount])
return nil
})
case newcomer.AcaPlayCount: //该UID在创作学院的观看记录
g.Go(func(context.Context) error {
s.acaPlayCount(c, mid, tsm[newcomer.AcaPlayCount])
return nil
})
case newcomer.DataUpStat: //该UID下所有avid的最高计数
g.Go(func(context.Context) error {
s.dataUpStat(c, mid, tsm[newcomer.DataUpStat])
return nil
})
case newcomer.AccProfileWithStat: //粉丝数量
g.Go(func(context.Context) error {
s.accProfileWithStat(c, mid, tsm[newcomer.AccProfileWithStat])
return nil
})
case newcomer.WmWaterMark: //水印状态
g.Go(func(context.Context) error {
s.wmWaterMark(c, mid, tsm[newcomer.WmWaterMark])
return nil
})
case newcomer.AccRelation: //该UID的关注列表含有“哔哩哔哩创作中心”
g.Go(func(context.Context) error {
s.accRelation(c, mid, tsm[newcomer.AccRelation])
return nil
})
case newcomer.DataUpArchiveStat: //该UID下任意avid的计数
g.Go(func(context.Context) error {
s.dataUpArchiveStatQuery(c, mid, tsm[newcomer.DataUpArchiveStat])
return nil
})
case newcomer.OrderGrowAccountState: //激励计划状态
g.Go(func(context.Context) error {
s.orderGrowAccountState(c, mid, tsm[newcomer.OrderGrowAccountState])
return nil
})
case newcomer.MedalCheckMedal: //该UID粉丝勋章
g.Go(func(context.Context) error {
s.medalCheckMedal(c, mid, tsm[newcomer.MedalCheckMedal])
return nil
})
}
}
g.Wait()
}
func (s *Service) arcUpCount(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
cnt, err := s.arc.UpCount(c, mid)
if err != nil {
log.Error("arcUpCount s.arc.UpCount mid(%d)|error(%v)", mid, err)
return
}
for _, v := range tasks {
if cnt >= v.TargetValue {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("arcUpCount s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
}
log.Info("arcUpCount finish task mid(%d)|count(%d)|", mid, cnt)
}
}
}
func (s *Service) acaPlayCount(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
cnt, err := s.aca.PlayCount(c, mid)
if err != nil {
log.Error("acaPlayCount s.aca.PlayCount error(%v)", err)
return
}
for _, v := range tasks {
if cnt >= v.TargetValue {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("acaPlayCount s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
continue
}
log.Info("acaPlayCount finish task mid(%d)|count(%d)|", mid, cnt)
}
}
}
func (s *Service) dataUpStat(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
st, err := s.data.UpStat(c, mid, time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102"))
if err != nil || st == nil {
log.Error("dataUpStat s.data.NewStat mid(%d) st(%+v) error(%v) ", mid, st, err)
return
}
for _, v := range tasks {
val := int64(v.TargetValue)
state := false
switch v.TargetType {
case newcomer.TargetType004:
if st.Reply >= val {
state = true
}
log.Info("dataUpStat TargetType004 mid(%d)|v(%+v)|", mid, st.Reply)
case newcomer.TargetType005:
if st.Share >= val {
state = true
}
log.Info("dataUpStat TargetType005 mid(%d)|v(%+v)|", mid, st.Share)
case newcomer.TargetType006:
if st.Fav >= val {
state = true
}
log.Info("dataUpStat TargetType006 mid(%d)|v(%+v)|", mid, st.Fav)
case newcomer.TargetType007:
if st.Coin >= val {
state = true
}
log.Info("dataUpStat TargetType007 mid(%d)|v(%+v)|", mid, st.Coin)
case newcomer.TargetType008:
if st.Like >= val {
state = true
}
log.Info("dataUpStat TargetType008 mid(%d)|v(%+v)|", mid, st.Like)
case newcomer.TargetType009:
if st.Dm >= val {
state = true
}
log.Info("dataUpStat TargetType009 mid(%d)|v(%+v)|", mid, st.Dm)
}
if state {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("dataUpStat s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
}
}
}
}
func (s *Service) accProfileWithStat(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
pl, err := s.acc.ProfileWithStat(c, mid)
if err != nil {
log.Error("accProfileWithStat s.acc.ProfileWithStat error(%v)", err)
return
}
if pl == nil {
return
}
for _, v := range tasks {
if pl.Follower >= int64(v.TargetValue) {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("accProfileWithStat s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
continue
}
log.Info("accProfileWithStat finish task mid(%d)|follower(%d)|", mid, pl.Follower)
}
}
}
func (s *Service) wmWaterMark(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
wm, err := s.wm.WaterMark(c, mid)
if err != nil {
log.Error("wmWaterMark s.wm.WaterMark mid(%d) error(%v)", mid, err)
return
}
for _, v := range tasks {
if wm != nil && wm.State == 1 && wm.URL != "" {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("wmWaterMark s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
continue
}
log.Info("wmWaterMark finish task mid(%d)|state(%d)|", mid, wm.State)
}
}
}
func (s *Service) accRelation(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
fid := creatorMID //用户哔哩哔哩创作中心 mid
fl, err := s.acc.Relations(c, mid, []int64{fid}, "")
if err != nil {
log.Error("accRelation s.acc.Relations mid(%d)|ip(%s)|error(%v)", mid, "", err)
return
}
if fl == nil {
return
}
for _, v := range tasks {
if st, ok := fl[fid]; ok && (st == 6 || st == 2) {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("accRelation s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
continue
}
log.Info("accRelation finish task mid(%d)|state(%d)|", mid, st)
}
}
}
func (s *Service) dataUpArchiveStatQuery(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
st, err := s.data.UpArchiveStatQuery(c, mid, time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102"))
if err != nil || st == nil {
log.Error("dataUpArchiveStatQuery s.data.UpArchiveStatQuery mid(%d)|err(%v)", mid, err)
return
}
for _, v := range tasks {
val := int64(v.TargetValue)
state := false
switch v.TargetType {
case newcomer.TargetType013:
if st.FromPhoneNum >= val {
log.Info("dataUpArchiveStatQuery TargetType013 mid(%d)|v(%+v)|", mid, st.FromPhoneNum)
state = true
}
case newcomer.TargetType015:
if st.PlayV >= val {
log.Info("dataUpArchiveStatQuery TargetType015 mid(%d)|v(%+v)|", mid, st.PlayV)
state = true
}
case newcomer.TargetType016:
if st.ReplyV >= val {
log.Info("dataUpArchiveStatQuery TargetType016 mid(%d)|v(%+v)|", mid, st.ReplyV)
state = true
}
case newcomer.TargetType017:
if st.ShareV >= val {
log.Info("dataUpArchiveStatQuery TargetType017 mid(%d)|v(%+v)|", mid, st.ShareV)
state = true
}
case newcomer.TargetType018:
if st.FavV >= val {
log.Info("dataUpArchiveStatQuery TargetType018 mid(%d)|v(%+v)|", mid, st.FavV)
state = true
}
case newcomer.TargetType019:
if st.CoinV >= val {
log.Info("dataUpArchiveStatQuery TargetType019 mid(%d)|v(%+v)|", mid, st.CoinV)
state = true
}
case newcomer.TargetType020:
if st.LikeV >= val {
log.Info("dataUpArchiveStatQuery TargetType020 mid(%d)|v(%+v)|", mid, st.LikeV)
state = true
}
case newcomer.TargetType021:
if st.DmV >= val {
log.Info("dataUpArchiveStatQuery TargetType021 mid(%d)|v(%+v)|", mid, st.DmV)
state = true
}
}
if state {
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("dataUpArchiveStatQuery s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
}
}
}
}
func (s *Service) orderGrowAccountState(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
ac, err := s.order.GrowAccountState(c, mid, 0)
if err != nil {
log.Error("orderGrowAccountState s.order.GrowUpPlan mid(%d) error(%v)", mid, err)
return
}
if ac == nil {
return
}
for _, v := range tasks {
if ac.State == 3 { //账号状态; 1: 未申请; 2: 待审核; 3: 已签约; 4.已驳回; 5.主动退出; 6:被动退出; 7:封禁
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("orderGrowAccountState s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
continue
}
log.Info("orderGrowAccountState finish task mid(%d)|state(%d)|", mid, ac.State)
}
}
}
func (s *Service) medalCheckMedal(c context.Context, mid int64, tasks []*newcomer.Task) {
if len(tasks) == 0 {
return
}
medal, err := s.medal.Medal(c, mid)
if err != nil {
log.Error("medalCheckMedal s.medal.Medal mid(%d) error(%v)", mid, err)
return
}
if medal == nil {
return
}
for _, v := range tasks {
status, err := strconv.Atoi(medal.Status)
if err != nil {
log.Error("medalCheckMedal strconv.Atoi medal.Status(%s) error(%v)", medal.Status, err)
continue
}
if status == 2 { //勋章审核状态 -1已拒绝 0未申请 1已申请 2已开通
_, err := s.newc.UpUserTask(c, mid, v.ID)
if err != nil {
log.Error("medalCheckMedal s.newc.UpUserTask mid(%d)|task id(%d)|err(%v)", mid, v.ID, err)
continue
}
log.Info("medalCheckMedal finish task mid(%d)|state(%d)|", mid, status)
}
}
}
func getTaskSortMap(tasks []*newcomer.Task) map[int8][]*newcomer.Task {
taskSortMap := make(map[int8][]*newcomer.Task)
for _, v := range tasks {
switch v.TargetType {
case newcomer.TargetType001, newcomer.TargetType014:
taskSortMap[newcomer.ArcUpCount] = append(taskSortMap[newcomer.ArcUpCount], v)
case newcomer.TargetType002: //分享
case newcomer.TargetType003:
taskSortMap[newcomer.AcaPlayCount] = append(taskSortMap[newcomer.AcaPlayCount], v)
case newcomer.TargetType004, newcomer.TargetType005, newcomer.TargetType006, newcomer.TargetType007, newcomer.TargetType008, newcomer.TargetType009:
taskSortMap[newcomer.DataUpStat] = append(taskSortMap[newcomer.DataUpStat], v)
case newcomer.TargetType010, newcomer.TargetType022:
taskSortMap[newcomer.AccProfileWithStat] = append(taskSortMap[newcomer.AccProfileWithStat], v)
case newcomer.TargetType011:
taskSortMap[newcomer.WmWaterMark] = append(taskSortMap[newcomer.WmWaterMark], v)
case newcomer.TargetType012:
taskSortMap[newcomer.AccRelation] = append(taskSortMap[newcomer.AccRelation], v)
case newcomer.TargetType013, newcomer.TargetType015, newcomer.TargetType016, newcomer.TargetType017, newcomer.TargetType018, newcomer.TargetType019, newcomer.TargetType020, newcomer.TargetType021:
taskSortMap[newcomer.DataUpArchiveStat] = append(taskSortMap[newcomer.DataUpArchiveStat], v)
case newcomer.TargetType023:
taskSortMap[newcomer.OrderGrowAccountState] = append(taskSortMap[newcomer.OrderGrowAccountState], v)
case newcomer.TargetType024:
taskSortMap[newcomer.MedalCheckMedal] = append(taskSortMap[newcomer.MedalCheckMedal], v)
}
}
return taskSortMap
}

File diff suppressed because it is too large Load Diff