package campaignstat import ( "joybuywork/internal/app" "joybuywork/internal/consts" "joybuywork/internal/consts/ckey" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/cmm" "joybuywork/internal/service/queue/producer" "joybuywork/internal/service/queue/types" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_stat" "joybuywork/proto/go_proto/workerr" "fmt" "time" "github.com/golang-module/carbon/v2" "gits.branchcn.com/backend/microcode/plugins/derivative/lock" ) type Stat struct { logic.Logic Req *pb.StatReq Res *pb.StatRes } func (s *Stat) Run() error { return logic.Run(s) } func (s *Stat) Exec() (err error) { cpn, err := s.campaign() if err != nil { return } switch cpn.Target { case mtype.FissionCampaignConfigTargetAdsGame: err = s.adsBehavior(cpn) if err != nil { return } default: } return } // 活动数据 func (s *Stat) 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 || cpn.IsDel == mtype.Yes { return nil, workerr.NotFound("campaign not found") } //活动可处理时间 endTime := utils.CampaignArchiveEnd(cpn.EndTime) if endTime.Before(time.Now()) && cpn.Target != mtype.FissionCampaignConfigTargetAdsGame { err = workerr.VerifyError("cpn stat end") return } return } // w2a 互动广告统计 func (s *Stat) adsBehavior(cpn *model.FissionCampaign) (err error) { if s.Req.GetWid() == "" { return } switch s.Req.BehaviorType { case mtype.FissionBehaviorTypeView: producer.NewCampaignNotice(s.Ctx).CampaignBehavior(types.CampaignBehavior{ CampaignId: cpn.ID, BehaviorType: s.Req.GetBehaviorType(), BehaviorTime: s.Req.GetBehaviorTime(), UserMark: s.Req.GetWid(), }) var channel *model.FissionCampaignChannel channel, err = cmm.NewCMM(s.Ctx, s.GetDao()).UserBindChannel(cpn.ID, s.Req.GetCMark()) if err != nil { return } if channel != nil { producer.NewCampaignNotice(s.Ctx).CampaignBehavior(types.CampaignBehavior{ CampaignId: cpn.ID, BehaviorType: mtype.FissionBehaviorTypeChannelView, BehaviorTime: s.Req.GetBehaviorTime(), UserMark: s.Req.GetWid(), MarkId: fmt.Sprint(channel.ID), }) } default: producer.NewCampaignNotice(s.Ctx).CampaignBehavior(types.CampaignBehavior{ CampaignId: cpn.ID, BehaviorType: s.Req.GetBehaviorType(), BehaviorTime: s.Req.GetBehaviorTime(), UserMark: s.Req.GetWid(), }) } // 去触发定时任务统计 t := carbon.CreateFromTimestamp(s.Req.GetBehaviorTime()) hourStr, dayStr := t.Format(consts.YmdH), t.ToShortDateString() hourEndTime, dayEndTime := t.AddHours(2).StartOfHour().Timestamp(), t.AddDays(2).StartOfDay().Timestamp() hourLock := app.NewRedisLock(s.Ctx, ckey.FissionAdsHourStat(cpn.ID, hourStr), lock.SetExpire(time.Duration(hourEndTime)*time.Second)) dayLock := app.NewRedisLock(s.Ctx, ckey.FissionAdsDayStat(cpn.ID, dayStr), lock.SetExpire(time.Duration(dayEndTime)*time.Second)) if hourLock.SoftLock() { err = s._fissionArchiveTask(cpn.ID, hourEndTime, mtype.FissionArchiveTaskMarkAdsHour) if err != nil { hourLock.Release() } } if dayLock.SoftLock() { err = s._fissionArchiveTask(cpn.ID, dayEndTime, mtype.FissionArchiveTaskMarkAdsDay) if err != nil { dayLock.Release() } } return } func (s *Stat) _fissionArchiveTask(cpnId, endTime int64, mark string) (err error) { m := s.GetDao().FissionArchiveTask _, err = m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpnId), m.Mark.Eq(mark), m.EndTime.Lt(endTime)). UpdateSimple(m.EndTime.Value(endTime), m.IsStop.Value(mtype.No)) if err != nil { err = s.BE().MysqlError(err) return } return }