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

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
}