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.

503 lines
12 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package action
import (
"joybuywork/internal/app"
"joybuywork/internal/consts/ckey"
"joybuywork/internal/repository/dao"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils"
"fmt"
"github.com/golang-module/carbon/v2"
"github.com/panjf2000/ants/v2"
"sync"
"time"
)
type StatHour struct {
Action
}
func (s *StatHour) Desc() string {
return "活动小时统计"
}
func (s *StatHour) OnceKey() *OnceKey {
return &OnceKey{
exp: 5 * time.Second,
key: ckey.CronStatHour(),
release: true,
}
}
func (s *StatHour) Exec() (err error) {
m := dao.FissionArchiveTask
list, err := m.WithContext(s.ctx).Where(
m.EndTime.Gte(time.Now().Unix()),
m.Mark.Eq(mtype.FissionArchiveTaskMarkCampaignHour),
m.IsStop.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
bt := map[string]int32{
mtype.FissionBehaviorMarkView: mtype.FissionBehaviorTypeView,
mtype.FissionBehaviorMarkClickPlay: mtype.FissionBehaviorTypeClickPlay,
mtype.FissionBehaviorMarkClickShare: mtype.FissionBehaviorTypeClickShare,
mtype.FissionBehaviorMarkViewDownload: mtype.FissionBehaviorTypeViewDownload,
mtype.FissionBehaviorMarkClickDownload: mtype.FissionBehaviorTypeClickDownload,
mtype.FissionBehaviorMarkViewWechat: mtype.FissionBehaviorTypeViewWechat,
mtype.FissionBehaviorMarkAppInstall: mtype.FissionBehaviorTypeAppInstall,
mtype.FissionBehaviorMarkAppOpen: mtype.FissionBehaviorTypeAppOpen,
mtype.FissionBehaviorMarkViewDownloadByWx: mtype.FissionBehaviorTypeViewDownloadByWx,
mtype.FissionBehaviorMarkAppRegister: mtype.FissionBehaviorTypeAppRegister,
mtype.FissionBehaviorMarkSign: mtype.FissionBehaviorTypeSign,
mtype.FissionBehaviorMarkSignTarget: mtype.FissionBehaviorTypeSignTarget,
mtype.FissionBehaviorMarkGrow: mtype.FissionBehaviorTypeGrow,
}
gp, _ := ants.NewPool(len(list))
defer gp.Release()
wg := &sync.WaitGroup{}
defer wg.Wait()
for _, v := range list {
wg.Add(1)
task := v
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(s.ctx, fmt.Sprintf("统计活动小时任务失败:任务id:%d", task.ID))
err = provider.NewFissionBehaviorTotal(s.ctx, task.CampaignID).BehaviorTotalCycle(mtype.FissionTotalCycleTypeHour, carbon.Now().SubHour(), bt)
if err != nil {
return
}
if task.EndTime < time.Now().Unix() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(task.ID)).UpdateSimple(m.IsStop.Value(mtype.Yes))
if err != nil {
return
}
}
})
}
return
}
type StatDay struct {
Action
}
func (s *StatDay) Desc() string {
return "活动天统计"
}
func (s *StatDay) OnceKey() *OnceKey {
return &OnceKey{
exp: 5 * time.Second,
key: ckey.CronStatDay(),
release: true,
}
}
func (s *StatDay) Exec() (err error) {
m := dao.FissionArchiveTask
list, err := m.WithContext(s.ctx).Where(
m.EndTime.Gte(time.Now().Unix()),
m.Mark.Eq(mtype.FissionArchiveTaskMarkCampaignDay),
m.IsStop.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
bt := map[string]int32{
mtype.FissionBehaviorMarkView: mtype.FissionBehaviorTypeView,
mtype.FissionBehaviorMarkClickPlay: mtype.FissionBehaviorTypeClickPlay,
mtype.FissionBehaviorMarkClickShare: mtype.FissionBehaviorTypeClickShare,
mtype.FissionBehaviorMarkViewDownload: mtype.FissionBehaviorTypeViewDownload,
mtype.FissionBehaviorMarkClickDownload: mtype.FissionBehaviorTypeClickDownload,
mtype.FissionBehaviorMarkViewWechat: mtype.FissionBehaviorTypeViewWechat,
mtype.FissionBehaviorMarkAppInstall: mtype.FissionBehaviorTypeAppInstall,
mtype.FissionBehaviorMarkAppOpen: mtype.FissionBehaviorTypeAppOpen,
mtype.FissionBehaviorMarkViewDownloadByWx: mtype.FissionBehaviorTypeViewDownloadByWx,
mtype.FissionBehaviorMarkAppRegister: mtype.FissionBehaviorTypeAppRegister,
mtype.FissionBehaviorMarkSign: mtype.FissionBehaviorTypeSign,
mtype.FissionBehaviorMarkSignTarget: mtype.FissionBehaviorTypeSignTarget,
mtype.FissionBehaviorMarkGrow: mtype.FissionBehaviorTypeGrow,
}
gp, _ := ants.NewPool(10)
defer gp.Release()
wg := &sync.WaitGroup{}
defer wg.Wait()
for _, v := range list {
wg.Add(1)
task := v
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(s.ctx, fmt.Sprintf("统计活动天任务失败:任务id:%d", task.ID))
err = provider.NewFissionBehaviorTotal(s.ctx, task.CampaignID).BehaviorTotalCycle(mtype.FissionTotalCycleTypeDay, carbon.Now().SubHours(12), bt)
if err != nil {
return
}
if task.EndTime < time.Now().Unix() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(task.ID)).UpdateSimple(m.IsStop.Value(mtype.Yes))
if err != nil {
return
}
}
})
}
return
}
type CondHour struct {
Action
}
func (s *CondHour) Desc() string {
return "活动完成条件小时统计"
}
func (s *CondHour) OnceKey() *OnceKey {
return &OnceKey{
exp: 5 * time.Second,
key: ckey.CronCondHour(),
release: true,
}
}
func (s *CondHour) Exec() (err error) {
m := dao.FissionArchiveTask
list, err := m.WithContext(s.ctx).Where(
m.EndTime.Gte(time.Now().Unix()),
m.Mark.Eq(mtype.FissionArchiveTaskMarkCondHour),
m.IsStop.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
gp, _ := ants.NewPool(10)
defer gp.Release()
wg := &sync.WaitGroup{}
defer wg.Wait()
for _, v := range list {
wg.Add(1)
task := v
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(s.ctx, fmt.Sprintf("活动完成条件小时统计失败:任务id:%d", task.ID))
var conds []*model.FissionCampaignCond
condM := dao.FissionCampaignCond
conds, err = condM.WithContext(s.ctx).Where(condM.CampaignID.Eq(task.CampaignID), condM.IsDel.Eq(mtype.No)).Find()
if err != nil {
return
}
var bt = map[string]int32{
mtype.FissionBehaviorMarkFinishTask: mtype.FissionBehaviorTypeFinishTask,
}
for _, cond := range conds {
bt[utils.BehaviorFormatMark(mtype.FissionBehaviorTypeFinishCond, cond.ID)] = mtype.FissionBehaviorTypeFinishCond
}
err = provider.NewFissionBehaviorTotal(s.ctx, task.CampaignID).BehaviorTotalCycle(mtype.FissionTotalCycleTypeHour, carbon.Now().SubHour(), bt)
if err != nil {
return
}
if task.EndTime < time.Now().Unix() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(task.ID)).UpdateSimple(m.IsStop.Value(mtype.Yes))
if err != nil {
return
}
// 停止更新,把天的也停掉
var dayStop *model.FissionArchiveTask
dayStop, err = m.WithContext(s.ctx).Where(
m.CampaignID.Eq(task.CampaignID),
m.Mark.Eq(mtype.FissionArchiveTaskMarkCondDay),
m.IsStop.Eq(mtype.Yes),
).Take()
if err = dbcheck.DbError(err); err != nil {
return
}
if dayStop != nil {
// 停止接收自定义事件
_, _ = condM.WithContext(s.ctx).Where(condM.CampaignID.Eq(task.CampaignID)).UpdateSimple(condM.IsDel.Value(mtype.Yes))
}
}
})
}
return
}
type CondDay struct {
Action
}
func (s *CondDay) Desc() string {
return "活动完成条件天统计"
}
func (s *CondDay) OnceKey() *OnceKey {
return &OnceKey{
exp: 5 * time.Second,
key: ckey.CronCondDay(),
release: true,
}
}
func (s *CondDay) Exec() (err error) {
m := dao.FissionArchiveTask
list, err := m.WithContext(s.ctx).Where(
m.EndTime.Gte(time.Now().Unix()),
m.Mark.Eq(mtype.FissionArchiveTaskMarkCondDay),
m.IsStop.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
gp, _ := ants.NewPool(10)
defer gp.Release()
wg := &sync.WaitGroup{}
defer wg.Wait()
for _, v := range list {
wg.Add(1)
task := v
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(s.ctx, fmt.Sprintf("活动完成条件天统计:任务id:%d", task.ID))
var conds []*model.FissionCampaignCond
condM := dao.FissionCampaignCond
conds, err = condM.WithContext(s.ctx).Where(condM.CampaignID.Eq(task.CampaignID), condM.IsDel.Eq(mtype.No)).Find()
if err != nil {
return
}
var bt = map[string]int32{
mtype.FissionBehaviorMarkFinishTask: mtype.FissionBehaviorTypeFinishTask,
}
for _, cond := range conds {
bt[utils.BehaviorFormatMark(mtype.FissionBehaviorTypeFinishCond, cond.ID)] = mtype.FissionBehaviorTypeFinishCond
}
err = provider.NewFissionBehaviorTotal(s.ctx, task.CampaignID).BehaviorTotalCycle(mtype.FissionTotalCycleTypeDay, carbon.Now().SubHours(12), bt)
if err != nil {
return
}
if task.EndTime < time.Now().Unix() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(task.ID)).UpdateSimple(m.IsStop.Value(mtype.Yes))
if err != nil {
return
}
// 停止更新,把小时的也停掉
var hourStop *model.FissionArchiveTask
hourStop, err = m.WithContext(s.ctx).Where(
m.CampaignID.Eq(task.CampaignID),
m.Mark.Eq(mtype.FissionArchiveTaskMarkCondHour),
m.IsStop.Eq(mtype.Yes),
).Take()
if err = dbcheck.DbError(err); err != nil {
return
}
if hourStop != nil {
// 停止接收自定义事件
_, _ = condM.WithContext(s.ctx).Where(condM.CampaignID.Eq(task.CampaignID)).UpdateSimple(condM.IsDel.Value(mtype.Yes))
}
}
})
}
return
}
type AdsDay struct {
Action
}
func (s *AdsDay) Desc() string {
return "广告活动天统计"
}
func (s *AdsDay) OnceKey() *OnceKey {
return &OnceKey{
exp: 5 * time.Second,
key: ckey.CronAdsDay(),
release: true,
}
}
func (s *AdsDay) Exec() (err error) {
m := dao.FissionArchiveTask
list, err := m.WithContext(s.ctx).Where(
m.EndTime.Gte(time.Now().Unix()),
m.Mark.Eq(mtype.FissionArchiveTaskMarkAdsDay),
m.IsStop.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
gp, _ := ants.NewPool(10)
defer gp.Release()
wg := &sync.WaitGroup{}
defer wg.Wait()
for _, v := range list {
wg.Add(1)
task := v
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(s.ctx, fmt.Sprintf("广告活动天统计:任务id:%d", task.ID))
var bt = map[string]int32{
mtype.FissionBehaviorMarkView: mtype.FissionBehaviorTypeView,
mtype.FissionBehaviorMarkAppInstall: mtype.FissionBehaviorTypeAppInstall,
}
err = provider.NewFissionBehaviorTotal(s.ctx, task.CampaignID).BehaviorTotalCycle(mtype.FissionTotalCycleTypeDay, carbon.Now().SubHours(12), bt)
if err != nil {
return
}
if task.EndTime < time.Now().Unix() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(task.ID), m.EndTime.Eq(task.EndTime)).UpdateSimple(m.IsStop.Value(mtype.Yes))
if err != nil {
return
}
}
})
}
return
}
type AdsHour struct {
Action
}
func (s *AdsHour) Desc() string {
return "广告活动小时统计"
}
func (s *AdsHour) OnceKey() *OnceKey {
return &OnceKey{
exp: 5 * time.Second,
key: ckey.CronAdsHour(),
release: true,
}
}
func (s *AdsHour) Exec() (err error) {
m := dao.FissionArchiveTask
list, err := m.WithContext(s.ctx).Where(
m.EndTime.Gte(time.Now().Unix()),
m.Mark.Eq(mtype.FissionArchiveTaskMarkAdsHour),
m.IsStop.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
gp, _ := ants.NewPool(10)
defer gp.Release()
wg := &sync.WaitGroup{}
defer wg.Wait()
for _, v := range list {
wg.Add(1)
task := v
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(s.ctx, fmt.Sprintf("广告活动小时统计:任务id:%d", task.ID))
var bt = map[string]int32{
mtype.FissionBehaviorMarkView: mtype.FissionBehaviorTypeView,
mtype.FissionBehaviorMarkAppInstall: mtype.FissionBehaviorTypeAppInstall,
}
err = provider.NewFissionBehaviorTotal(s.ctx, task.CampaignID).BehaviorTotalCycle(mtype.FissionTotalCycleTypeHour, carbon.Now().SubHour(), bt)
if err != nil {
return
}
if task.EndTime < time.Now().Unix() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(task.ID), m.EndTime.Eq(task.EndTime)).UpdateSimple(m.IsStop.Value(mtype.Yes))
if err != nil {
return
}
}
})
}
return
}