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 }