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
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
|
|
}
|