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.

152 lines
3.4 KiB
Go

package campaignnotice
import (
"joybuywork/internal/consts"
"joybuywork/internal/consts/ckey"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/provider/award"
"joybuywork/internal/service/provider/cachecurd"
"joybuywork/internal/service/provider/players"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
"time"
)
type ChildInvite struct {
logic.Logic
Req *types.CampaignChildInvite
}
func (s *ChildInvite) Exec() (err error) {
cpn, err := cache.NewCampaign(s.Ctx).FindById(s.Req.CampaignId)
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn.Status != mtype.FissionCampaignStatusCancel {
return
}
m := s.GetDao().FissionCampaignReward
list, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Order(m.Step).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
l := len(list)
var rankNum int64
switch l {
case 7:
rankNum = 10000
case 6:
rankNum = 100
case 5:
rankNum = 10
default:
rankNum = int64(l)
}
ranker, err := cachecurd.NewRanker(s.Ctx, ckey.FissionChildRank(cpn.ID), cachecurd.SetChildBuild(cpn.ID, cpn.ChildType))
if err != nil {
err = s.BE().CacheError(err)
return
}
ranks, err := ranker.GetRank(rankNum)
if err != nil {
err = s.BE().CacheError(err)
return
}
if len(ranks) == 0 {
return
}
pcpn, err := cache.NewCampaign(s.Ctx).FindById(cpn.Pid)
if err != nil {
err = s.BE().CacheError(err)
return
}
childUserCache := cache.NewFissionChildUser(s.Ctx)
childUserM := s.GetDao().FissionChildUser
for i, rank := range ranks {
var idx = -1
user, _ := cache.NewFissionUser(s.Ctx, cpn.Pid).FindById(utils.StrToInt64(rank.UserId))
if i < 4 {
idx = i
} else if i < 10 {
idx = 4
} else if i < 100 {
idx = 5
} else if i < 10000 {
idx = 6
}
if idx == -1 {
return
}
player, _ := childUserCache.FindByUniqIdx(user.ID, cpn.ID)
if player == nil || player.RecordID > 0 {
continue
}
reward := list[idx]
var record *model.FissionRewardRecord
record, _, _, err = award.NewAwardReward(s.Ctx, s.GetDao(), cpn.ProjectID, user).One(reward, true, award.RewardRecordChildId(player.CampaignID))
if err != nil {
return
}
_, err = childUserM.WithContext(s.Ctx).
Where(childUserM.ID.Eq(player.ID)).
UpdateSimple(
childUserM.LastDone.Value(time.Now().Unix()),
childUserM.RewardID.Value(record.RewardID),
childUserM.RecordID.Value(record.ID),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
err = s.GetDao().FissionChildUserRecord.WithContext(s.Ctx).Create(withdefault.FissionChildUserRecord(&model.FissionChildUserRecord{
PCpnID: player.PCpnID,
CampaignID: player.CampaignID,
UserID: player.UserID,
PlayerID: player.ID,
ChildType: player.ChildType,
Mark: mtype.FissionChildUserRecordSourceInvite,
RecordID: record.ID,
}))
if err != nil {
err = s.BE().MysqlError(err)
return
}
_ = childUserCache.Clear(player)
if reward.PropMark == mtype.FissionCampaignRewardPropMarkReward {
continue
}
switch pcpn.FissionID {
case consts.IdKeep:
keepDog, _ := players.NewKeepDog(s.Ctx, user)
_ = keepDog.ChildActive(reward.RewardNum, mtype.FissionCampaignChildTypeInvite)
}
}
return
}