package containers import ( "joybuywork/internal/app" "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/service/provider" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_fission_web" "joybuywork/proto/go_proto/workerr" ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice" ) type FissionWebAdsUser struct { logic.Logic Req *pb.AdsUserReq Res *pb.AdsUserRes } func (s *FissionWebAdsUser) Run() error { return logic.Run(s) } func (s *FissionWebAdsUser) Exec() (err error) { cpn, channel, err := s.campaign() if err != nil { return } wbu, err := s.webUser(cpn, channel) if err != nil { return } err = s.reward(cpn, wbu) if err != nil { return } return } func (s *FissionWebAdsUser) campaign() (cpn *model.FissionCampaign, channel *model.FissionCampaignChannel, err error) { cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId()) if err != nil { err = s.BE().CacheError(err) return } if cpn == nil || cpn.IsDel == mtype.Yes { err = workerr.NotFound("campaign not found") return } // 用户要绑定的渠道 channel, err = cmm.NewCMM(s.Ctx, s.GetDao()).UserBindChannel(cpn.ID, s.Req.GetCid()) if err != nil { return } return } // 生成web用户 func (s *FissionWebAdsUser) webUser(cpn *model.FissionCampaign, channel *model.FissionCampaignChannel) (wbu *model.FissionWebUser, err error) { cc := cache.NewFissionWebUser(s.Ctx) wbu, err = cc.FindByWebId(cpn.ID, s.Req.GetWebId()) if err != nil { err = s.BE().CacheError(err) return } defer s.AddAfterRun(func() (err error) { s.Res.Id = wbu.ID return }) m := s.GetDao().FissionWebUser 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 } _ = cc.Clear(wbu) } 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(), IP: ip, IPCity: ipCity, }) err = m.WithContext(s.Ctx).Create(wbu) if err != nil { err = s.BE().MysqlError(err) return } return } // 是否拿了奖品 func (s *FissionWebAdsUser) reward(cpn *model.FissionCampaign, wbu *model.FissionWebUser) (err error) { if wbu.RewardID == 0 { return } m := s.GetDao().FissionCampaignReward reward, err := m.WithContext(s.Ctx).Where(m.ID.Eq(wbu.RewardID), m.CampaignID.Eq(cpn.ID)).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } if reward == nil { return } preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, reward.RewardID) if err != nil { return } info, _ := preward.InfoAutoLang(reward.RewardID, cpn.GetLangMarks()[0]) s.AddAfterRun(func() (err error) { s.Res.RewardId = wbu.RewardID s.Res.Title = info.Title s.Res.ImgUrl = info.ImgUrl return }) return }