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.

172 lines
3.8 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 statcampaign
import (
"joybuywork/internal/app"
"joybuywork/internal/repository/dao"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/queue/consumer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
"joybuywork/internal/utils/verify"
"joybuywork/proto/go_proto/workerr"
"fmt"
"strings"
"sync"
"github.com/Shopify/sarama"
"github.com/panjf2000/ants/v2"
"gits.branchcn.com/backend/microcode/plugins/kafka"
)
func Run() (err error) {
c, err := consumer.NewConsumer(&StatCampaign{})
if err != nil {
return
}
c.Run()
return
}
type StatCampaign struct{}
func (s StatCampaign) Params() consumer.CParams {
return consumer.CParams{
Topic: types.StatCampaignTopic,
Num: 5,
Name: "campaign_notice",
GroupName: types.StatCampaignGroup,
Config: kafka.DefaultConsumerConfig(),
}
}
func (s StatCampaign) Receive(session sarama.ConsumerGroupSession, message *sarama.ConsumerMessage) {
// 结束标记消息已消费
defer session.MarkMessage(message, "")
var handler *consumer.Ctx
switch utils.Bs(message.Key) {
case types.StatCampaignKey:
handler = consumer.NewCtx("活动统计", message, statCampaign)
default:
return
}
handler.Done()
}
func statCampaign(ctx *consumer.Ctx) (err error) {
var val types.StatCampaignValue
err = ctx.Parse(&val)
if err != nil {
return
}
// 不是自定义事件,或者是自定义事件,但是已经指定了活动,要走直接进入逻辑
if !verify.InArray[int32](val.BehaviorType, mtype.FissionBehaviorTypeCustom, mtype.FissionBehaviorTypePurchase) {
var container = new(Logic)
{
container.Init(ctx.Context())
container.Req = &val
}
return logic.Run(container)
}
if val.BehaviorType == mtype.FissionBehaviorTypePurchase {
if val.PurchasesData == nil {
app.Logger.Error(ctx.Context(), "没有接收到支付信息")
return
}
val.Event = "purchases"
val.EventData = []types.EventData{
{
EventKey: "count",
EventVal: fmt.Sprint(val.PurchasesData.Amount),
},
{
EventKey: "times",
EventVal: fmt.Sprint(val.PurchasesData.PurchaseCount),
},
}
}
// 如果hid是优值的,就要用活动hash_id来处理
if val.Hid != "" {
hids := strings.Split(val.Hid, ",")
wg := sync.WaitGroup{}
defer wg.Wait()
for _, id := range hids {
wg.Add(1)
one := val
one.Hid = id
app.GoSafe(func() {
defer wg.Done()
var container = new(Logic)
{
container.Init(ctx.Context(), logic.WithErrNotifyNeqCode(workerr.VerifyErrorCode, 404))
container.Req = &one
}
_ = logic.Run(container)
}, fmt.Sprintf("处理活动统计逻辑panic, cpn_id: %s", id))
}
return
}
// 没有指定活动id的自定义事件,那么就要全局活动推送
var keys []string
for _, v := range val.EventData {
keys = append(keys, v.EventKey)
}
// 自定义事件要先找到事件绑定的活动
m := dao.Q.FissionCampaignCond
var ids []int64
err = m.WithContext(ctx.Context()).
Where(
m.ProjectID.Eq(val.ProjectID),
m.Event.Eq(val.Event),
m.EventKey.In(keys...),
m.EventType.In(mtype.FissionCampaignCondEventTypeCustom, mtype.FissionCampaignCondEventTypeStandard),
m.IsDel.Eq(mtype.No),
).
Group(m.CampaignID).
Pluck(m.CampaignID, &ids)
if err != nil || len(ids) == 0 {
return
}
wg := sync.WaitGroup{}
defer wg.Wait()
gp, _ := ants.NewPool(len(ids))
defer gp.Release()
for _, id := range ids {
wg.Add(1)
one := val
one.CampaignID = id
_ = gp.Submit(func() {
defer wg.Done()
defer app.TryCatch(ctx.Context(), fmt.Sprintf("处理活动统计逻辑panic, cpn_id: %d", id))
var container = new(Logic)
{
container.Init(ctx.Context(), logic.WithErrNotifyNeqCode(workerr.VerifyErrorCode, 404))
container.Req = &one
}
_ = logic.Run(container)
})
}
return
}