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.
348 lines
7.8 KiB
Go
348 lines
7.8 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/repository/withdefault"
|
|
"joybuywork/internal/service/cmm"
|
|
"joybuywork/internal/utils"
|
|
"joybuywork/internal/utils/logic"
|
|
"joybuywork/internal/utils/timez"
|
|
pb "joybuywork/proto/go_proto/w_campaign"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
dlinkpb "gits.branchcn.com/backend/deeplink/proto/go_proto/dlink"
|
|
"time"
|
|
)
|
|
|
|
type AdsStore struct {
|
|
logic.Logic
|
|
Req *pb.AdsStoreReq
|
|
Res *pb.AdsStoreRes
|
|
|
|
project *model.Project
|
|
temp *model.FissionTemp
|
|
}
|
|
|
|
func (s *AdsStore) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *AdsStore) Exec() (err error) {
|
|
err = s.depend()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
cpn, err := s.create()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.createConfig(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.createDefault(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.createReward(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.fission(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.createLink(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.saveDelayLinkData(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *AdsStore) depend() (err error) {
|
|
project, err := finder.Project(s.Ctx, s.Req.GetProjectId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("project not found")
|
|
}
|
|
|
|
tempM := s.GetDao().FissionTemp
|
|
|
|
temp, err := tempM.WithContext(s.Ctx).Where(tempM.HashID.Eq(s.Req.GetTemplateId())).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if temp == nil {
|
|
return workerr.NotFound("temp not found")
|
|
}
|
|
|
|
s.project = project
|
|
s.temp = temp
|
|
|
|
return
|
|
}
|
|
|
|
// 创建活动
|
|
func (s *AdsStore) create() (cpn *model.FissionCampaign, err error) {
|
|
startTime := time.Now().Unix()
|
|
cpn = withdefault.FissionCampaign(&model.FissionCampaign{
|
|
FissionID: s.temp.FissionID,
|
|
ProjectID: s.project.ID,
|
|
CreatorID: s.Req.GetUserId(),
|
|
TemplateID: s.temp.ID,
|
|
StartTime: timez.GMT(startTime, 8),
|
|
TOffset: 8,
|
|
TStart: startTime,
|
|
Title: s.Req.GetTitle(),
|
|
Status: mtype.FissionCampaignStatusPub,
|
|
Target: mtype.FissionCampaignConfigTargetAdsGame,
|
|
})
|
|
|
|
cpn.CoverURL, err = s._getCoverUrl()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
cpn.SetLangTypes([]int8{s.temp.LangType})
|
|
|
|
m := s.GetDao().FissionCampaign
|
|
if err = m.WithContext(s.Ctx).Create(cpn); err != nil {
|
|
return nil, s.BE().MysqlError(err)
|
|
}
|
|
|
|
s.AddAfterRun(func() (err error) {
|
|
s.Res.Id = cpn.ID
|
|
s.Res.HashId = cpn.HashID
|
|
return
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
// 创建配置
|
|
func (s *AdsStore) createConfig(cpn *model.FissionCampaign) (err error) {
|
|
conf := withdefault.FissionCampaignConfig(&model.FissionCampaignConfig{
|
|
CampaignID: cpn.ID,
|
|
ImageMain: s.Req.GetBgImg(),
|
|
PageTitle: s.Req.GetPageTitle(),
|
|
Countdown: s.Req.GetCountdown(),
|
|
})
|
|
|
|
m := s.GetDao().FissionCampaignConfig
|
|
if err = m.WithContext(s.Ctx).Create(conf); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
style := withdefault.FissionCampaignStyle(&model.FissionCampaignStyle{
|
|
CampaignID: cpn.ID,
|
|
MainImg: s.Req.GetBgImg(),
|
|
PageTitle: s.Req.GetPageTitle(),
|
|
})
|
|
|
|
styleM := s.GetDao().FissionCampaignStyle
|
|
if err = styleM.WithContext(s.Ctx).Create(style); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 创建奖品
|
|
func (s *AdsStore) createReward(cpn *model.FissionCampaign) (err error) {
|
|
var relateIds []int64
|
|
var relateMap = make(map[int64]string)
|
|
var add = make([]*model.FissionCampaignReward, 0, len(s.Req.GetRewards()))
|
|
for _, v := range s.Req.GetRewards() {
|
|
add = append(add, withdefault.FissionCampaignReward(&model.FissionCampaignReward{
|
|
CampaignID: cpn.ID,
|
|
RewardID: v.GetRewardId(),
|
|
Odds: v.GetOdds(),
|
|
}))
|
|
|
|
if _, ok := relateMap[v.GetRewardId()]; !ok && v.GetRewardId() > 0 {
|
|
relateMap[v.GetRewardId()] = ""
|
|
relateIds = append(relateIds, v.GetRewardId())
|
|
}
|
|
}
|
|
|
|
if len(add) == 0 {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionCampaignReward
|
|
if err = m.WithContext(s.Ctx).Create(add...); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
var relates []*model.RewardRelated
|
|
for _, v := range relateIds {
|
|
relates = append(relates, withdefault.RewardRelated(&model.RewardRelated{
|
|
RewardID: v,
|
|
RelateID: cpn.ID,
|
|
RelateTable: s.GetDao().FissionCampaign.TableName(),
|
|
}))
|
|
}
|
|
|
|
relateM := s.GetDao().RewardRelated
|
|
if err = relateM.WithContext(s.Ctx).Create(relates...); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 创建默认数据
|
|
func (s *AdsStore) createDefault(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionCampaignChannel
|
|
|
|
// 默认站内渠道
|
|
var mark = utils.GetRandEnStr(consts.ChannelMarkLen)
|
|
var chs = []*model.FissionCampaignChannel{
|
|
withdefault.FissionCampaignChannel(&model.FissionCampaignChannel{
|
|
CampaignID: cpn.ID,
|
|
IsDefault: mtype.Yes,
|
|
Mark: mark,
|
|
Title: consts.ChannelDefaultName,
|
|
CType: mtype.FissionCampaignChannelTypeApp,
|
|
}),
|
|
}
|
|
|
|
err = m.WithContext(s.Ctx).Create(chs...)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
// 统计任务
|
|
var atMarks = []string{mtype.FissionArchiveTaskMarkAdsHour, mtype.FissionArchiveTaskMarkAdsDay}
|
|
var archiveTasks = make([]*model.FissionArchiveTask, 0, len(atMarks))
|
|
for _, v := range atMarks {
|
|
archiveTasks = append(archiveTasks, withdefault.FissionArchiveTask(&model.FissionArchiveTask{
|
|
CampaignID: cpn.ID,
|
|
EndTime: 0,
|
|
Mark: v,
|
|
IsStop: mtype.Yes,
|
|
}))
|
|
}
|
|
|
|
atm := s.GetDao().FissionArchiveTask
|
|
err = atm.WithContext(s.Ctx).Create(archiveTasks...)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
err = cmm.NewCMM(s.Ctx, s.GetDao()).AnalyzeCampaign(cpn.ProjectID, cpn.ID, cpn.StartTime, cpn.EndTime, 0)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 创建访问链接
|
|
func (s *AdsStore) createLink(cpn *model.FissionCampaign) (err error) {
|
|
_, err = app.NewDeepLinkLink().CreateCampaignLinkOne(s.Ctx, &dlinkpb.CreateCampaignLinkOneReq{
|
|
ProjectId: s.project.ID,
|
|
CampaignId: cpn.ID,
|
|
CreatedTime: cpn.CreatedAt,
|
|
})
|
|
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 设置延迟深度链接数据
|
|
func (s *AdsStore) saveDelayLinkData(cpn *model.FissionCampaign) (err error) {
|
|
var data = &dlinkpb.SaveCampaignDataListReq{
|
|
ProjectId: cpn.ProjectID,
|
|
CampaignId: cpn.ID,
|
|
Data: make([]*dlinkpb.SaveCampaignDataListReq_Data, 0, len(s.Req.GetDelayLinkData())),
|
|
}
|
|
|
|
for _, v := range s.Req.GetDelayLinkData() {
|
|
data.Data = append(data.Data, &dlinkpb.SaveCampaignDataListReq_Data{
|
|
Key: v.GetKey(),
|
|
Val: v.GetValue(),
|
|
})
|
|
}
|
|
|
|
_, err = app.NewDeepLinkLink().SaveCampaignDataList(s.Ctx, data)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *AdsStore) _getCoverUrl() (coverUrl string, err error) {
|
|
m := s.GetDao().FissionTempImage
|
|
img, err := m.WithContext(s.Ctx).Where(m.TempID.Eq(s.temp.ID), m.Mark.Eq("main")).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if img.Val != s.Req.GetBgImg() {
|
|
return s.Req.GetBgImg(), nil
|
|
}
|
|
|
|
group, err := cache.NewFissionTempGroup(s.Ctx).FindById(s.temp.GroupID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
return group.CoverURL, nil
|
|
}
|
|
|
|
func (s *AdsStore) fission(cpn *model.FissionCampaign) (err error) {
|
|
switch cpn.FissionID {
|
|
case consts.IdAdsFlip:
|
|
return s._flip(cpn)
|
|
default:
|
|
return
|
|
}
|
|
}
|
|
|
|
func (s *AdsStore) _flip(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionCampaignFlip
|
|
|
|
err = m.WithContext(s.Ctx).Create(withdefault.FissionCampaignFlip(&model.FissionCampaignFlip{
|
|
CampaignID: cpn.ID,
|
|
InitChance: 0,
|
|
CardImg: s.Req.GetFlip().GetCardImg(),
|
|
DayChance: 0,
|
|
}))
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|