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.

197 lines
4.2 KiB
Go

package campaign
import (
"joybuywork/internal/app"
"joybuywork/internal/consts"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign"
"joybuywork/proto/go_proto/workerr"
dlinkpb "gits.branchcn.com/backend/deeplink/proto/go_proto/dlink"
)
type AdsShow struct {
logic.Logic
Req *pb.AdsShowReq
Res *pb.AdsShowRes
project *model.Project
temp *model.FissionTemp
}
func (s *AdsShow) Run() error {
return logic.Run(s)
}
func (s *AdsShow) Exec() (err error) {
cpn, err := s.setCampaign()
if err != nil {
return
}
err = s.setDelayLinkData(cpn)
if err != nil {
return
}
err = s.serReward(cpn)
if err != nil {
return
}
err = s.fission(cpn)
if err != nil {
return
}
return
}
// 设置活动数据
func (s *AdsShow) setCampaign() (cpn *model.FissionCampaign, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetHashId())
if err != nil {
return nil, s.BE().CacheError(err)
}
if cpn == nil || cpn.IsDel == mtype.Yes {
err = workerr.NotFound("campaign not found")
return
}
cc := cache.NewCampaignConfig(s.Ctx)
conf, err := cc.FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
s.AddAfterRun(func() (err error) {
s.Res.Id = cpn.ID
s.Res.HashId = cpn.HashID
s.Res.Title = cpn.Title
s.Res.TempId = cpn.TemplateID
s.Res.ProjectId = cpn.ProjectID
s.Res.FissionMark = consts.FissionIdMap[cpn.FissionID]
s.Res.Status = int32(cpn.Status)
s.Res.PageTitle = conf.PageTitle
s.Res.BgImg = conf.ImageMain
s.Res.TOffset = cpn.TOffset
s.Res.TStart = cpn.TStart
s.Res.TEnd = cpn.TEnd
s.Res.CoverUrl = cpn.CoverURL
s.Res.Target = int32(cpn.Target)
s.Res.Countdown = conf.Countdown
s.Res.FissionId = cpn.FissionID
return
})
return
}
// 设置延迟深度链接数据
func (s *AdsShow) setDelayLinkData(cpn *model.FissionCampaign) (err error) {
res, err := app.NewDeepLinkLink().GetCampaignDataList(s.Ctx, &dlinkpb.GetCampaignDataListReq{
ProjectId: cpn.ProjectID,
CampaignId: cpn.ID,
})
if err != nil {
return
}
s.Res.DelayLinkData = make([]*pb.AdsShowRes_KV, 0, len(res.GetList()))
for _, v := range res.GetList() {
s.Res.DelayLinkData = append(s.Res.DelayLinkData, &pb.AdsShowRes_KV{
Key: v.GetKey(),
Value: v.GetVal(),
})
}
return
}
func (s *AdsShow) serReward(cpn *model.FissionCampaign) (err error) {
m := s.GetDao().FissionCampaignReward
list, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var bIds []int64
for _, v := range list {
bIds = append(bIds, v.RewardID)
}
prewards, err := provider.NewRewards(s.Ctx, cpn.ProjectID, bIds...)
if err != nil {
return
}
langMark := cpn.GetLangMarks()[0]
s.AddAfterRun(func() (err error) {
s.Res.Rewards = make([]*pb.AdsShowRes_Reward, 0, len(list))
for _, v := range list {
info, _ := prewards.InfoAutoLang(v.RewardID, langMark)
one := &pb.AdsShowRes_Reward{
Id: v.ID,
RewardId: v.RewardID,
Odds: v.Odds,
Title: info.Title,
ImgUrl: info.ImgUrl,
KvData: make([]*pb.AdsShowRes_KV, 0, len(info.KvData)),
ReceiveType: info.ReceiveType,
Contact: info.Contact,
Url: info.Url,
}
for _, kv := range info.KvData {
one.KvData = append(one.KvData, &pb.AdsShowRes_KV{
Key: kv.Key,
Value: kv.Value,
})
}
s.Res.Rewards = append(s.Res.Rewards, one)
}
return
})
return
}
func (s *AdsShow) fission(cpn *model.FissionCampaign) (err error) {
switch cpn.FissionID {
case consts.IdAdsFlip:
return s._flip(cpn)
default:
return
}
}
func (s *AdsShow) _flip(cpn *model.FissionCampaign) (err error) {
m := s.GetDao().FissionCampaignFlip
conf, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if conf != nil {
s.Res.Flip = &pb.AdsShowRes_Flip{CardImg: conf.CardImg}
}
return
}