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.

149 lines
3.8 KiB
Go

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
}