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.
202 lines
4.4 KiB
Go
202 lines
4.4 KiB
Go
package containers
|
|
|
|
import (
|
|
"joybuywork/internal/app"
|
|
"joybuywork/internal/consts/ckey"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/repository/withdefault"
|
|
"joybuywork/internal/utils/blink"
|
|
"joybuywork/internal/utils/logic"
|
|
pb "joybuywork/proto/go_proto/w_fission_web"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
"fmt"
|
|
"time"
|
|
|
|
ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice"
|
|
)
|
|
|
|
type FissionWebBindWeb struct {
|
|
logic.Logic
|
|
Req *pb.BindWebReq
|
|
Res *pb.BindWebRes
|
|
}
|
|
|
|
func (s *FissionWebBindWeb) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *FissionWebBindWeb) Exec() (err error) {
|
|
cpn, err := s.campaign()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
channel, err := s.channel(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
wbu, err := s.webUser(cpn, channel)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.mark(cpn, channel, wbu)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *FissionWebBindWeb) mark(cpn *model.FissionCampaign, channel *model.FissionCampaignChannel, wbu *model.FissionWebUser) (err error) {
|
|
project, err := finder.Project(s.Ctx, cpn.ProjectID)
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
// 记录最后的行为渠道
|
|
err = app.Redis.Set(s.Ctx, ckey.FissionWebLastChannel(cpn.ID, wbu.WebID), fmt.Sprint(channel.ID), 2*time.Hour)
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
s.AddAfterRun(func() (err error) {
|
|
s.Res.Id = wbu.ID
|
|
s.Res.UserId = wbu.UserID
|
|
s.Res.DownloadLink = blink.NewCampaignLink(project.Domain, cpn.HashID, channel.Mark).CampaignDownloadLink()
|
|
s.Res.Submit = wbu.Answer != ""
|
|
|
|
return
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
func (s *FissionWebBindWeb) campaign() (cpn *model.FissionCampaign, err error) {
|
|
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if cpn == nil {
|
|
err = workerr.NotFound("not found cpn")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *FissionWebBindWeb) channel(cpn *model.FissionCampaign) (channel *model.FissionCampaignChannel, err error) {
|
|
m := s.GetDao().FissionCampaignChannel
|
|
|
|
channel, err = m.WithContext(s.Ctx).Where(
|
|
m.CampaignID.Eq(cpn.ID),
|
|
m.Mark.Eq(s.Req.GetCMark()),
|
|
m.CType.Eq(mtype.FissionCampaignChannelTypeWeb),
|
|
m.IsDel.Eq(mtype.No),
|
|
).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if channel != nil {
|
|
return
|
|
}
|
|
|
|
// 找不到就取默认渠道
|
|
channel, err = m.WithContext(s.Ctx).Where(
|
|
m.CampaignID.Eq(cpn.ID),
|
|
m.IsDefault.Eq(mtype.Yes),
|
|
m.CType.Eq(mtype.FissionCampaignChannelTypeWeb),
|
|
m.IsDel.Eq(mtype.No),
|
|
).Take()
|
|
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if channel == nil {
|
|
err = workerr.NotFound("not found channel")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *FissionWebBindWeb) webUser(cpn *model.FissionCampaign, channel *model.FissionCampaignChannel) (wbu *model.FissionWebUser, err error) {
|
|
m := s.GetDao().FissionWebUser
|
|
wbu, err = m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.WebID.Eq(s.Req.GetWebId())).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if wbu != nil {
|
|
if wbu.UserID == 0 && wbu.ChannelID != channel.ID {
|
|
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(wbu.ID)).UpdateSimple(m.ChannelID.Value(channel.ID))
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
rewardId, err := s.fissionReward(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
var ip = s.Req.GetIp()
|
|
var ipCity string
|
|
if ip != "" {
|
|
res, _ := app.NewDeepLinkDevice().FindIpAreaCode(s.Ctx, &ddevicepb.FindIpAreaCodeReq{Ip: s.Req.GetIp()})
|
|
ipCity = res.GetAreaCode()
|
|
}
|
|
|
|
wbu = withdefault.FissionWebUser(&model.FissionWebUser{
|
|
CampaignID: cpn.ID,
|
|
ChannelID: channel.ID,
|
|
WebID: s.Req.GetWebId(),
|
|
RewardID: rewardId,
|
|
IP: ip,
|
|
IPCity: ipCity,
|
|
})
|
|
|
|
err = m.WithContext(s.Ctx).Create(wbu)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 玩法的站外奖品id
|
|
func (s *FissionWebBindWeb) fissionReward(cpn *model.FissionCampaign) (rewardId int64, err error) {
|
|
m := s.GetDao().FissionCampaignReward
|
|
reward, err := m.WithContext(s.Ctx).Where(
|
|
m.CampaignID.Eq(cpn.ID),
|
|
m.RewardType.Eq(mtype.FissionCampaignRewardTypeWeb),
|
|
m.IsDel.Eq(mtype.No),
|
|
).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if reward != nil {
|
|
rewardId = reward.ID
|
|
}
|
|
|
|
return
|
|
}
|