You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

985 lines
24 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package campaignuser
import (
"joybuywork/internal/app"
"joybuywork/internal/consts"
"joybuywork/internal/consts/ckey"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/cmm"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils"
"joybuywork/internal/utils/lockdo"
"joybuywork/internal/utils/logic"
"joybuywork/internal/utils/timez"
"joybuywork/internal/utils/verify"
pb "joybuywork/proto/go_proto/w_campaign_user"
"joybuywork/proto/go_proto/workerr"
"strings"
"time"
deventpb "gits.branchcn.com/backend/deeplink/proto/go_proto/devent"
)
type Task struct {
logic.Logic
Req *pb.TaskReq
Res *pb.TaskRes
cpnControl *provider.CampaignTZ
lvLimitMap map[int64][]string
}
func (s *Task) Run() error {
return logic.Run(s)
}
func (s *Task) Exec() (err error) {
user, cpn, err := s.user()
if err != nil {
return
}
return s.task(cpn, user)
}
// 用户信息
func (s *Task) user() (user *model.FissionUser, cpn *model.FissionCampaign, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId())
if err != nil {
err = s.BE().CacheError(err)
return
}
user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if user == nil {
err = workerr.NotFound("not found user")
return
}
s.cpnControl = provider.NewCampaignTZ(s.Ctx, cpn, user.LangMark)
return
}
func (s *Task) _newTask(cpn *model.FissionCampaign, user *model.FissionUser) (err error) {
m := s.GetDao().FissionCampaignTicket
list, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
taskM := s.GetDao().FissionCampaignTask
tasks, err := taskM.WithContext(s.Ctx).Where(
taskM.CampaignID.Eq(cpn.ID),
taskM.IsDel.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var taskMap = make(map[string]*model.FissionCampaignTask, len(tasks))
for _, task := range tasks {
taskMap[task.TaskMark] = task
}
for _, v := range list {
switch v.Mark {
case mtype.FissionCampaignTicketCustom:
err = s._custom(user, cpn, v, taskMap)
if err != nil {
return
}
case mtype.FissionCampaignTicketFixed:
err = s._fixed(v, taskMap)
if err != nil {
return
}
}
}
return
}
func (s *Task) _custom(user *model.FissionUser, cpn *model.FissionCampaign, ticket *model.FissionCampaignTicket, taskMap map[string]*model.FissionCampaignTask) (err error) {
if ticket.Open == mtype.No {
return
}
m := s.GetDao().FissionCampaignCond
conds, err := m.WithContext(s.Ctx).Where(
m.CampaignID.Eq(cpn.ID),
m.IsDel.Eq(mtype.No),
m.RewardID.Eq(0),
).Order(m.Sort.Desc(), m.ID).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
condM := s.GetDao().FissionUserCond
list, err := condM.WithContext(s.Ctx).Where(condM.UserID.Eq(user.ID)).Find()
if err != nil {
return s.BE().MysqlError(err)
}
var userCondMap = make(map[int64]*model.FissionUserCond)
for _, v := range list {
userCondMap[v.CondID] = v
}
// 用户当前语言是配置的语言
var condLangMap = make(map[int64]*mtype.LangCond)
if verify.InArray[string](user.LangMark, cpn.GetLangMarks()...) {
lang, err1 := cache.NewCampaignLang(s.Ctx).FindByCampaignId(user.CampaignID, user.LangMark)
if err1 != nil {
err = s.BE().CacheError(err1)
return
}
if lang != nil {
for _, v := range lang.GetConds() {
condLangMap[v.CondId] = v
}
}
}
var doExp = make(map[int64]struct{})
var dayExp, weekExp []*model.FissionCampaignTask
var dayLimitTaskIds []int64 // 有每日上限的任务
var weekLimitTask []*model.FissionCampaignTask // 有每周上限的任务
var taskIds = make([]int64, 0, len(taskMap))
var levelLimit = make(map[int64][]int64)
var rewardIds []int64
var receiveIds []int64
for _, v := range taskMap {
taskIds = append(taskIds, v.ID)
if v.DayLimit > 0 {
dayLimitTaskIds = append(dayLimitTaskIds, v.ID)
if _, ok := doExp[v.ID]; !ok {
dayExp = append(dayExp, v)
doExp[v.ID] = struct{}{}
}
}
if v.WeekLimit > 0 { // 这个一定要放在dayLimit 后面,因为doExp的顺序是 day > week
weekLimitTask = append(weekLimitTask, v)
if _, ok := doExp[v.ID]; !ok {
weekExp = append(weekExp, v)
doExp[v.ID] = struct{}{}
}
}
if v.LevelLimit != "" {
levelLimit[v.ID] = v.GetLevelLimit()
}
if v.RewardID > 0 {
rewardIds = append(rewardIds, v.RewardID)
}
if v.AwardMode == mtype.FissionCampaignTaskAwardModeManual {
receiveIds = append(receiveIds, v.ID)
}
}
// 完成任务获得的总次数
var sumNum struct {
Num int32
}
taskM := s.GetDao().FissionUserTaskRecord
err = taskM.WithContext(s.Ctx).
Select(taskM.Chance.Sum().As("num")).
Where(
taskM.UserID.Eq(user.ID),
taskM.TaskID.In(taskIds...),
taskM.LimitProp.Eq(mtype.No),
).Scan(&sumNum)
if err != nil {
err = s.BE().MysqlError(err)
return
}
// 全部任务完成的任务完成次数
btAllFinish, err := s._btAllFinish(user, ticket, taskMap)
if err != nil {
return
}
// 当天任务完成次数
taskDayCount, err := s._taskDayCount(user, dayLimitTaskIds)
if err != nil {
return
}
// 周任务完成次数
taskWeekCount, err := s._taskWeekCount(user, weekLimitTask)
if err != nil {
return
}
// 任务过期重置
err = s._condExp(ticket.BothType, dayExp, weekExp, userCondMap)
if err != nil {
return
}
// 任务限制
err = s._levelLimit(levelLimit)
if err != nil {
return
}
// 有前置任务
preCond, err := s._preCond(user)
if err != nil {
return
}
// 是否有领奖任务
receiveMap, err := s._receive(user, receiveIds)
if err != nil {
return
}
// 奖品
rewardMap, err := s._reward(cpn.ProjectID, user.LangMark, rewardIds)
if err != nil {
return
}
var projectId int64
var condExtra = make(map[string]*deventpb.GetCustomEventListRes_Info)
var events []string
for _, v := range conds {
events = append(events, v.Event)
projectId = v.ProjectID
}
if len(events) > 0 {
res, _ := app.NewDeepLinkEvent().GetCustomEventList(s.Ctx, &deventpb.GetCustomEventListReq{
ProjectId: projectId,
EventKeyList: events,
LangMark: user.LangMark,
})
for _, v := range res.GetList() {
condExtra[v.GetEventKey()] = v
}
}
s.Res.Custom = &pb.TaskRes_Custom{
Open: int32(ticket.Open),
BothType: int32(ticket.BothType),
Chance: sumNum.Num,
Cond: make([]*pb.TaskRes_Cond, 0, len(conds)),
BothAll: nil,
}
for _, v := range conds {
var one = &pb.TaskRes_Cond{
Id: v.ID,
Desc: v.Desc,
Num: 0,
IfCond: int32(v.IfCond),
Total: "",
Event: v.Event,
EventKey: v.EventKey,
EventVal: v.EventVal,
TaskChance: 0,
TaskLimit: 0,
CanDo: false,
WebUrl: v.WebURL,
AppParam: v.ExtraParam,
TomorrowCanDo: false,
EventType: int32(v.EventType),
ViewType: int32(v.ViewType),
WeekCanDo: 0,
WeekNum: 0,
GoShow: int32(v.GoShow),
AdsStrategyId: v.AdsStrategyID,
IsSuper: int32(v.IsSuper),
HasPre: 0,
Reward: nil,
PropMark: "",
ExpiredSec: 0,
PcParam: v.PcParam,
TaskId: 0,
HasReceive: 0,
TriggerType: int32(v.TriggetType),
GoText: v.GoText,
ClickEffectOpen: int32(v.ClickEffectOpen),
ClickEffect: v.ClickEffect,
ClickEffectUnit: v.ClickEffectUnit,
PullInvite: int32(v.PullInvite),
}
if condLang, ok := condLangMap[v.ID]; ok {
one.Desc = condLang.Desc
one.GoText = condLang.GoText
}
if userCond, ok := userCondMap[v.ID]; ok {
one.Num = userCond.Num
one.Total = userCond.Total
}
if v.OpenJump == mtype.Yes {
if condLang, ok := condLangMap[v.ID]; ok {
one.WebUrl = condLang.WebURL
one.AppParam = condLang.ExtraParam
one.PcParam = condLang.PcParam
}
} else {
if param, ok := condExtra[v.Event]; ok {
one.WebUrl = param.WebUrl
one.AppParam = param.ExtraParam
one.PcParam = param.PcParam
}
}
if ticket.BothType == mtype.FissionCampaignTicketBothTypeAll {
if task, ok := taskMap[mtype.FissionCampaignTaskMarkCondAll]; ok {
if s._beLevelLimit(task.ID, user.LevelMark) {
continue
}
//语言限制
if lm := task.GetLangMarks(); len(lm) > 0 && !verify.InArray(user.LangMark, lm...) {
continue
}
one.CanDo, one.TomorrowCanDo, one.WeekCanDo = s._taskDo(task, btAllFinish, taskDayCount[task.ID], taskWeekCount[task.ID])
one.WeekNum = int32(task.WeekNum)
one.TaskId = task.ID
one.HasReceive = receiveMap[task.ID]
}
} else {
if task, ok := taskMap[utils.FissionCampaignTaskMarkCondOneVal(v.ID)]; ok {
if s._beLevelLimit(task.ID, user.LevelMark) {
continue
}
//语言限制
if lm := task.GetLangMarks(); len(lm) > 0 && !verify.InArray(user.LangMark, lm...) {
continue
}
// 需要前置任务
if task.HasPre == mtype.Yes {
if exp, ok1 := preCond[task.PreCond]; !ok1 {
s.Res.PreCond = append(s.Res.PreCond, task.PreCond)
continue
} else if exp > 0 && exp <= time.Now().Unix() {
continue
} else {
one.ExpiredSec = exp - time.Now().Unix()
}
}
one.HasPre = int32(task.HasPre)
one.TaskChance = task.Chance
one.TaskLimit = task.TaskLimit
one.CanDo, one.TomorrowCanDo, one.WeekCanDo = s._taskDo(task, one.Num, taskDayCount[task.ID], taskWeekCount[task.ID])
one.WeekNum = int32(task.WeekNum)
one.Reward = rewardMap[task.RewardID]
one.PropMark = task.PropMark
one.TaskId = task.ID
one.HasReceive = receiveMap[task.ID]
}
}
s.Res.Custom.Cond = append(s.Res.Custom.Cond, one)
}
if ticket.BothType == mtype.FissionCampaignTicketBothTypeAll {
if task, ok := taskMap[mtype.FissionCampaignTaskMarkCondAll]; ok {
s.Res.Custom.BothAll = &pb.TaskRes_BothAll{
TaskChance: task.Chance,
TaskLimit: task.TaskLimit,
Finish: btAllFinish,
Reward: rewardMap[task.RewardID],
PropMark: task.PropMark,
}
}
}
return
}
// 周任务完成次数
func (s *Task) _taskWeekCount(user *model.FissionUser, weekLimitTask []*model.FissionCampaignTask) (taskWeekCount map[int64]int64, err error) {
taskWeekCount = make(map[int64]int64, len(weekLimitTask))
if len(weekLimitTask) == 0 {
return
}
for _, task := range weekLimitTask {
start, end := timez.GetWeekEnd(s.cpnControl.GetTz(), int32(task.WeekNum))
key := ckey.FissionUserWeekLimit(start, user.ID, task.ID)
taskWeekCount[task.ID], err = lockdo.Int64(s.Ctx, key, func() (num int64, err error) {
taskRecordM := s.GetDao().FissionUserTaskRecord
return taskRecordM.WithContext(s.Ctx).Where(
taskRecordM.UserID.Eq(user.ID),
taskRecordM.TaskID.Eq(task.ID),
taskRecordM.CreatedAt.Between(start, end),
).Count()
})
}
return
}
// 当天任务完成次数
func (s *Task) _taskDayCount(user *model.FissionUser, dayLimitTaskIds []int64) (taskDayCount map[int64]int64, err error) {
taskDayCount = make(map[int64]int64, len(dayLimitTaskIds))
if len(dayLimitTaskIds) == 0 {
return
}
day, start, end := timez.GMTStartAndEndTs(s.cpnControl.GetTz())
for _, taskId := range dayLimitTaskIds {
key := ckey.FissionUserTaskDayLimit(day, user.ID, taskId)
taskDayCount[taskId], err = lockdo.Int64(s.Ctx, key, func() (num int64, err error) {
taskRecordM := s.GetDao().FissionUserTaskRecord
return taskRecordM.WithContext(s.Ctx).Where(
taskRecordM.UserID.Eq(user.ID),
taskRecordM.TaskID.Eq(taskId),
taskRecordM.CreatedAt.Gte(start),
taskRecordM.CreatedAt.Lte(end),
).Count()
})
}
return
}
func (s *Task) _condExp(bothType int8, dayExp, weekExp []*model.FissionCampaignTask, userCondMap map[int64]*model.FissionUserCond) (err error) {
// 把要过期的
if bothType == mtype.FissionCampaignTicketBothTypeAll {
var start, end int64
if len(dayExp) > 0 {
_, start, end = timez.GMTStartAndEndTs(s.cpnControl.GetTz())
} else if len(weekExp) > 0 {
start, end = timez.GetWeekEnd(s.cpnControl.GetTz(), int32(weekExp[0].WeekNum))
}
if start == 0 {
return
}
condM := s.GetDao().FissionUserCond
for _, cond := range userCondMap {
if cond.TotalExp >= start {
continue
}
_, err = condM.WithContext(s.Ctx).Where(
condM.ID.Eq(cond.ID),
condM.UpdatedAt.Eq(cond.UpdatedAt),
condM.TotalExp.Gt(0),
).UpdateSimple(
condM.TotalExp.Value(end),
condM.Total.Value(""),
condM.CountNum.Value(0),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
return
}
// 任一任务完成的处理
condM := s.GetDao().FissionUserCond
for _, task := range dayExp {
condId := utils.FissionCampaignTaskMarkCondOneCondId(task.TaskMark)
var start, end int64
if len(dayExp) > 0 {
_, start, end = timez.GMTStartAndEndTs(s.cpnControl.GetTz())
} else if len(weekExp) > 0 {
start, end = timez.GetWeekEnd(s.cpnControl.GetTz(), int32(weekExp[0].WeekNum))
}
if start == 0 {
continue
}
cond, ok := userCondMap[condId]
if !ok || cond.TotalExp >= start {
continue
}
_, err = condM.WithContext(s.Ctx).Where(
condM.ID.Eq(cond.ID),
condM.UpdatedAt.Eq(cond.UpdatedAt),
condM.TotalExp.Gt(0),
).UpdateSimple(
condM.TotalExp.Value(end),
condM.Total.Value(""),
condM.CountNum.Value(0),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
return
}
// 完成所有任务的任务完成次数
func (s *Task) _btAllFinish(user *model.FissionUser, ticket *model.FissionCampaignTicket, taskMap map[string]*model.FissionCampaignTask) (btAllFinish int64, err error) {
if ticket.BothType != mtype.FissionCampaignTicketBothTypeAll {
return
}
task, ok := taskMap[mtype.FissionCampaignTaskMarkCondAll]
if !ok {
return
}
key := ckey.FissionUserTaskCpnLimit(user.ID, task.ID)
btAllFinish, err = lockdo.Int64(s.Ctx, key, func() (num int64, err error) {
taskRecordM := s.GetDao().FissionUserTaskRecord
return taskRecordM.WithContext(s.Ctx).Where(taskRecordM.UserID.Eq(user.ID), taskRecordM.TaskID.Eq(task.ID)).Count()
})
if err != nil {
err = s.BE().CacheError(err)
return
}
return
}
func (s *Task) _taskDo(task *model.FissionCampaignTask, taskDoneNum, dayDoneNum, weekDoneNum int64) (canDo, tomorrowDo bool, weekDo int32) {
canDo = true
// 总限制
if task.TaskLimit > 0 && int64(task.TaskLimit) <= taskDoneNum { // 任务总限制不能做了
canDo = false
return
}
if task.WeekLimit > 0 && int64(task.WeekLimit) <= weekDoneNum { // 有周限制,本周不能做了
canDo = false
t, _ := timez.GMTTimeStart(s.cpnControl.GetTz())
w := utils.Ternary[int32](t.Weekday() == 0, 7, int32(t.Weekday())) // 本周的周几
// 1-下周再来,2-周几再来
weekDo = utils.Ternary[int32](w >= int32(task.WeekNum), 1, 2)
return
}
if task.DayLimit > 0 && int64(task.DayLimit) <= dayDoneNum { // 有每日限制,今天不能做了
canDo, tomorrowDo = false, true
return
}
return
}
func (s *Task) _fixed(ticket *model.FissionCampaignTicket, taskMap map[string]*model.FissionCampaignTask) (err error) {
if ticket.Open == mtype.No {
return
}
var task *model.FissionCampaignTask
switch ticket.AppEvent {
case mtype.FissionCampaignTicketAppEventRegister:
task = taskMap[mtype.FissionCampaignTaskMarkRegister]
case mtype.FissionCampaignTicketAppEventInstall:
task = taskMap[mtype.FissionCampaignTaskMarkInstall]
}
if task == nil {
return
}
s.AddAfterRun(func() (err error) {
s.Res.Fixed = &pb.TaskRes_Fixed{
Open: int32(ticket.Open),
AppEvent: int32(ticket.AppEvent),
TargetNum: task.Num,
Chance: task.Chance,
ChanceLimit: task.ChanceLimit,
CanDo: true,
}
return
})
return
}
// 任务
func (s *Task) task(cpn *model.FissionCampaign, user *model.FissionUser) (err error) {
if !consts.NewEventCpn(cpn.FissionID) {
return s._oldTask(cpn, user)
}
err = s._newTask(cpn, user)
if err != nil {
return
}
return s._day(cpn)
}
// 兼容未升级的活动数据
func (s *Task) _oldTask(cpn *model.FissionCampaign, user *model.FissionUser) (err error) {
conf, err := cache.NewCampaignConfig(s.Ctx).FindByCampaignId(user.CampaignID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if !verify.InArray(conf.Option, mtype.FissionCampaignConfigTargetOptionUse, mtype.FissionCampaignConfigTargetOptionSelf, mtype.FissionCampaignConfigTargetOptionFriend) {
return
}
m := s.GetDao().FissionCampaignCond
conds, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(user.CampaignID), m.IsDel.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
condM := s.GetDao().FissionUserCond
list, err := condM.WithContext(s.Ctx).Where(condM.UserID.Eq(user.ID)).Find()
if err != nil {
return s.BE().MysqlError(err)
}
var userCondMap = make(map[int64]*model.FissionUserCond)
for _, v := range list {
userCondMap[v.CondID] = v
}
statM := s.GetDao().FissionUserStat
stat, err := statM.WithContext(s.Ctx).Where(statM.UserID.Eq(user.ID)).Take()
if err = dbcheck.DbError(err); err != nil {
return s.BE().MysqlError(err)
}
// 用户当前语言是配置的语言
var condLangMap = make(map[int64]string)
if verify.InArray(user.LangMark, cpn.GetLangMarks()[1:]...) {
lang, err1 := cache.NewCampaignLang(s.Ctx).FindByCampaignId(user.CampaignID, user.LangMark)
if err1 != nil {
err = s.BE().CacheError(err1)
return
}
if lang != nil {
for _, v := range lang.GetConds() {
condLangMap[v.CondId] = v.Desc
}
}
}
s.AddAfterRun(func() (err error) {
s.Res.Custom = &pb.TaskRes_Custom{
Open: 1,
BothType: int32(conf.BothType),
Chance: 0,
Cond: make([]*pb.TaskRes_Cond, 0, len(conds)),
BothAll: nil,
}
for _, v := range conds {
one := &pb.TaskRes_Cond{
Id: v.ID,
Desc: v.Desc,
IfCond: int32(v.IfCond),
Event: v.Event,
EventKey: v.EventKey,
EventVal: v.EventVal,
TaskChance: 0,
TaskLimit: 0,
CanDo: true,
}
if desc, ok := condLangMap[v.ID]; ok {
one.Desc = desc
}
if userCond, ok := userCondMap[v.ID]; ok {
one.Num = userCond.Num
one.Total = userCond.Total
}
s.Res.Custom.Cond = append(s.Res.Custom.Cond, one)
}
if conf.BothType == mtype.FissionCampaignTicketBothTypeAll {
var bothAll = &pb.TaskRes_BothAll{
TaskChance: 1,
}
if stat != nil {
bothAll.Finish = stat.TargetNum
}
s.Res.Custom.BothAll = bothAll
}
return
})
return
}
// 每日任务
func (s *Task) _day(cpn *model.FissionCampaign) (err error) {
var chance int32
switch cpn.FissionID {
case consts.IdDice:
m := s.GetDao().FissionCampaignDice
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
case consts.IdBlindBox:
m := s.GetDao().FissionCampaignBlind
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
case consts.IdSlotMachine:
m := s.GetDao().FissionCampaignSlot
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
case consts.IdLuckyGrid:
m := s.GetDao().FissionCampaignGrid
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
case consts.IdPrizeWheel:
m := s.GetDao().FissionCampaignWheel
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
case consts.IdFlip:
m := s.GetDao().FissionCampaignFlip
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
case consts.IdQa, consts.IdQaVideo, consts.IdQaAudio, consts.IdPrizeAnswer:
m := s.GetDao().FissionCampaignQa
conf, err1 := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take()
if err1 != nil {
err = s.BE().MysqlError(err1)
return
}
if conf != nil {
chance = conf.DayChance
}
default:
}
s.AddAfterRun(func() (err error) {
s.Res.FixDay = &pb.TaskRes_Day{
Open: utils.Ternary[int32](chance > 0, 1, 0),
Chance: chance,
CanDo: true,
}
return
})
return
}
// 用户等级限制
func (s *Task) _levelLimit(taskLvIdMap map[int64][]int64) (err error) {
var titleMap = make(map[int64]string)
var ids []int64
for _, lvIds := range taskLvIdMap {
for _, lvId := range lvIds {
if _, ok := titleMap[lvId]; !ok {
titleMap[lvId] = ""
ids = append(ids, lvId)
}
}
}
m := s.GetDao().FissionUserLevel
list, err := m.WithContext(s.Ctx).Where(m.ID.In(ids...), m.DeletedAt.Eq(0)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, v := range list {
titleMap[v.ID] = v.Mark
}
s.lvLimitMap = make(map[int64][]string)
for id, lvIds := range taskLvIdMap {
for _, lvId := range lvIds {
s.lvLimitMap[id] = append(s.lvLimitMap[id], titleMap[lvId])
}
}
return
}
// 是不是等级限制
func (s *Task) _beLevelLimit(taskId int64, levelMark string) bool {
marks, ok := s.lvLimitMap[taskId]
if !ok {
return false
} //没有证明没开限制
return !verify.OneInArray(marks, strings.Split(levelMark, ","))
}
// 前置任务
func (s *Task) _preCond(user *model.FissionUser) (doneMap map[int32]int64, err error) {
m := s.GetDao().FissionUserPreCond
list, err := m.WithContext(s.Ctx).Select(m.PreCond, m.ExpiredAt).Where(m.UserID.Eq(user.ID)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
doneMap = make(map[int32]int64, len(list))
for _, v := range list {
doneMap[v.PreCond] = v.ExpiredAt
}
return
}
// 当天任务完成次数
func (s *Task) _reward(projectId int64, langMark string, rewardIds []int64) (rewardMap map[int64]*pb.TaskRes_Reward, err error) {
rewardMap = make(map[int64]*pb.TaskRes_Reward, len(rewardIds))
if len(rewardIds) == 0 {
return
}
m := s.GetDao().FissionCampaignReward
list, err := m.WithContext(s.Ctx).Where(m.ID.In(rewardIds...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var hasPoint bool
var bIds []int64
for _, v := range list {
bIds = append(bIds, v.RewardID)
if !hasPoint && v.PropMark == mtype.FissionCampaignTaskPropMarkPoint {
hasPoint = true
}
}
var pointTitle, pointImg string
if hasPoint {
pointTitle, pointImg, _, _ = cmm.NewCMM(s.Ctx, s.GetDao()).GetCoinInfo(projectId, langMark)
}
bewards, err := provider.NewRewards(s.Ctx, projectId, bIds...)
if err != nil {
return
}
for _, v := range list {
one := &pb.TaskRes_Reward{
Id: v.ID,
}
switch v.PropMark {
case mtype.FissionCampaignTaskPropMarkPoint:
one.Title, one.ImgUrl = pointTitle, pointImg
case mtype.FissionCampaignTaskPropMarkReward:
info, _ := bewards.InfoAutoLang(v.RewardID, langMark)
one.Title, one.ImgUrl = info.Title, info.ImgUrl
}
rewardMap[v.ID] = one
}
return
}
func (s *Task) _receive(user *model.FissionUser, taskIds []int64) (receiveMap map[int64]int32, err error) {
receiveMap = make(map[int64]int32, len(taskIds))
if len(taskIds) == 0 {
return
}
for _, id := range taskIds {
receiveMap[id] = 0
}
m := s.GetDao().FissionUserTaskReward
list, err := m.WithContext(s.Ctx).Select(m.TaskID).Where(m.UserID.Eq(user.ID), m.ReceiveTime.Eq(0), m.TaskID.In(taskIds...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, v := range list {
receiveMap[v.TaskID] = 1
}
return
}