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.2 KiB
Go

package delay
import (
"context"
"joybuywork/internal/app"
"joybuywork/internal/consts/ckey"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dao"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils/logic"
"fmt"
"gits.branchcn.com/backend/microcode/plugins/derivative/delay"
)
func Setup() error {
customers := delay.RegisterConsumer(
delayCommon(),
)
return customers.Listen()
}
func Stop() {
delay.Stop()
}
func delayCommon() *delay.Consumer {
return delay.NewRedisDelayQueue(context.Background(), app.Redis.Cache, ckey.DelayCommonKey()).Consumer(commonCustomerAction)
}
// 通用对列消费者
func commonCustomerAction(ctx context.Context, d delay.Delivery) error {
var handler *Ctx
switch d.Type {
case types.CommonRewardPush:
handler = NewCtx(ctx, "奖品延时回调", d, rewardPush)
case types.CommonGlobalRewardPush:
handler = NewCtx(ctx, "全局奖品延时回调", d, globalRewardPush)
case types.CommonCoinExpired:
handler = NewCtx(ctx, "T币过期处理", d, coinExpired)
case types.CommonCheckRewardPush:
handler = NewCtx(ctx, "检查奖品是否成功推送", d, checkRewardPush)
default:
app.Logger.Error(ctx, fmt.Sprintf("不存在%s类型的延时对列处理场景", d.Type))
}
return handler.Done()
}
func checkRewardPush(ctx *Ctx) (err error) {
var data *types.DelayCommonCheckRewardPush
err = ctx.Parse(&data)
if err != nil {
return
}
reward, err := cache.NewReward(ctx.Context()).FindById(data.BaseRewardId)
if err != nil {
return
}
if reward == nil || reward.ReceiveType != mtype.RewardReceiveTypeNotify {
return
}
m := dao.FissionNotify
ntf, err := m.WithContext(ctx.Context()).Where(
m.CampaignID.Eq(data.CampaignId),
m.RecordID.Eq(data.UserRewardId),
).Take()
if err = dbcheck.DbError(err); err != nil {
return
}
if ntf != nil {
return
}
producer.NewCampaignNotice(ctx.Context()).CampaignRewardNotify(types.CampaignRewardNotify{
CampaignId: data.CampaignId,
UserId: data.UserId,
UserRewardId: data.UserRewardId,
})
return
}
func coinExpired(ctx *Ctx) (err error) {
var data *types.DelayCommonRewardPush
err = ctx.Parse(&data)
if err != nil {
return
}
m := dao.ProjectUserCoinExpired
expired, err := m.WithContext(ctx.Context()).Where(m.ID.Eq(data.TaskId)).Take()
if err = dbcheck.DbError(err); err != nil {
return
}
if expired == nil {
return
}
producer.NewCampaignNotice(ctx.Context()).ProjectUserCoinDeduct(types.ProjectUserCoinDeduct{
UserId: expired.UserID,
ExpiredId: expired.ID,
})
return
}
func rewardPush(ctx *Ctx) (err error) {
var data *types.DelayCommonRewardPush
err = ctx.Parse(&data)
if err != nil {
return
}
container := new(RewardPush)
{
container.Init(ctx.Context(), logic.WithErrData(data))
container.Req = data
}
return logic.Run(container)
}
func globalRewardPush(ctx *Ctx) (err error) {
var data *types.DelayCommonGlobalRewardPush
err = ctx.Parse(&data)
if err != nil {
return
}
container := new(GlobalRewardPush)
{
container.Init(ctx.Context(), logic.WithErrData(data))
container.Req = data
}
return logic.Run(container)
}