package campaignnotice import ( "joybuywork/internal/app" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/notify" "joybuywork/internal/service/queue/types" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" "joybuywork/internal/utils/verify" "joybuywork/proto/go_proto/workerr" ) type RewardNotify struct { logic.Logic Req *types.CampaignRewardNotify } func (s *RewardNotify) Exec() (err error) { cpn, user, err := s.campaign() if err != nil { return } err = s.notify(cpn, user) if err != nil { return } return } func (s *RewardNotify) notify(cpn *model.FissionCampaign, user *model.FissionUser) (err error) { rewardRecordM := s.GetDao().FissionRewardRecord.SubTable(cpn.ID) record, err := rewardRecordM.WithContext(s.Ctx).Where(rewardRecordM.ID.Eq(s.Req.UserRewardId)).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } if record == nil { err = workerr.NotFound("not found reward record") return } if record.Status != mtype.FissionRewardRecordStatusWait { return } // 固定奖品不处理 if verify.InArray[int64](record.BaseRewardID, app.FixRewardsIdThank, app.FixRewardsIdChallengeFailed) { _, err = rewardRecordM. WithContext(s.Ctx). Where(rewardRecordM.ID.Eq(record.ID)). UpdateSimple(rewardRecordM.Status.Value(mtype.FissionRewardRecordStatusSuccess)) if err != nil { return s.BE().MysqlError(err) } recordM := s.GetDao().FissionRewardRecord _, err = recordM. WithContext(s.Ctx). Where(recordM.ID.Eq(record.ID)). UpdateSimple(recordM.Status.Value(mtype.FissionRewardRecordStatusSuccess)) if err != nil { return s.BE().MysqlError(err) } return } baseReward, err := cache.NewReward(s.Ctx).FindById(record.BaseRewardID) if err != nil { err = s.BE().CacheError(err) return } // 是需要推送的奖品,但是没绑定回调地址 if baseReward == nil || (baseReward.ReceiveType == mtype.RewardReceiveTypeNotify && baseReward.URLID == 0) { return s._errData(record) } // 活动结束 if (cpn.EndTime > 0 && record.CreatedAt > cpn.EndTime) || (cpn.Status == mtype.FissionCampaignStatusCancel && record.CreatedAt > cpn.UpdatedAt) { _, err = rewardRecordM.WithContext(s.Ctx).Where(rewardRecordM.ID.Eq(record.ID)). UpdateSimple( rewardRecordM.Status.Value(mtype.FissionRewardRecordStatusFail), rewardRecordM.FailType.Value(mtype.FissionRewardRecordFailTypeCli), rewardRecordM.FailMsg.Value("活动结束"), ) if err != nil { return s.BE().MysqlError(err) } recordM := s.GetDao().FissionRewardRecord _, err = recordM. WithContext(s.Ctx). Where(recordM.ID.Eq(record.ID)). UpdateSimple( recordM.Status.Value(mtype.FissionRewardRecordStatusFail), recordM.FailType.Value(mtype.FissionRewardRecordFailTypeCli), recordM.FailMsg.Value("活动结束"), ) if err != nil { return s.BE().MysqlError(err) } if record.MallRecordID > 0 { mallRecordM := s.GetDao().RedeemMallRecord _, err = mallRecordM. WithContext(s.Ctx). Where(mallRecordM.ID.Eq(record.MallRecordID)). UpdateSimple( mallRecordM.Status.Value(mtype.RedeemMallRecordStatusFail), mallRecordM.FailType.Value(mtype.RewardPushFailTypeCli), mallRecordM.FailMsg.Value("活动结束"), ) if err != nil { return s.BE().MysqlError(err) } } return } switch baseReward.ReceiveType { case mtype.RewardReceiveTypeContact: // 自主发放,改成需要手动发放 return s._manual(record) case mtype.RewardReceiveTypeForm: // 表单 return s._form(record) case mtype.RewardReceiveTypeClient, mtype.RewardReceiveTypeNone: // 客户端回调要等客户端那边同步状态 return default: } // 推送数据 rewardHashId, rewardTitle, kvData := record.HashID, record.Title, baseReward.GetJustKvData() var rewardNum = utils.Ternary[int32](record.RewardNum < 1, 1, record.RewardNum) project, err := finder.Project(s.Ctx, cpn.ProjectID) if err != nil { err = s.BE().CacheError(err) return } url, err := cache.NewNotifyURL(s.Ctx).FindById(baseReward.URLID) if err != nil { err = s.BE().CacheError(err) return } // 找上级用户 var parentSubUserId string if user.ParentID > 0 { var parent *model.FissionUser parent, err = cache.NewFissionUser(s.Ctx, cpn.ID).FindById(user.ParentID) if err != nil { err = s.BE().CacheError(err) return } if parent != nil { parentSubUserId = parent.SubUserID } } err = notify.Reward{ CampaignId: cpn.ID, RewardId: s.Req.UserRewardId, UserId: user.ID, ParentId: user.ParentID, CampaignHashId: cpn.HashID, RewardHashId: rewardHashId, KvData: kvData, RewardType: record.RewardType, RewardTitle: rewardTitle, RewardNum: rewardNum, SubUserId: user.SubUserID, ParentSubUserId: parentSubUserId, Lang: utils.STernary[string](user.UserLang, "", user.LangMark), Title: cpn.Title, MallRecordId: record.MallRecordID, }.Send(s.Ctx, url.URL, project.NotifyToken, project.PushLadder, url.GetHeaders()) return } func (s *RewardNotify) _manual(record *model.FissionRewardRecord) (err error) { m := s.GetDao().FissionRewardRecord _, err = m.WithContext(s.Ctx).Where(m.ID.Eq(record.ID)).UpdateSimple( m.Status.Value(mtype.FissionRewardRecordStatusManual), ) if err != nil { return s.BE().MysqlError(err) } sm := s.GetDao().FissionRewardRecord.SubTable(record.CampaignID) _, err = sm.WithContext(s.Ctx).Where(sm.ID.Eq(record.ID)).UpdateSimple( sm.Status.Value(mtype.FissionRewardRecordStatusManual), ) if err != nil { return s.BE().MysqlError(err) } return } func (s *RewardNotify) _form(record *model.FissionRewardRecord) (err error) { m := s.GetDao().FissionRewardRecord _, err = m.WithContext(s.Ctx).Where( m.ID.Eq(record.ID), m.Status.Eq(mtype.FissionRewardRecordStatusWait), ).UpdateSimple( m.Status.Value(mtype.FissionRewardRecordStatusWaitForm), ) if err != nil { return s.BE().MysqlError(err) } sm := s.GetDao().FissionRewardRecord.SubTable(record.CampaignID) _, err = sm.WithContext(s.Ctx).Where( sm.ID.Eq(record.ID), sm.Status.Eq(mtype.FissionRewardRecordStatusWait), ).UpdateSimple( sm.Status.Value(mtype.FissionRewardRecordStatusWaitForm), ) if err != nil { return s.BE().MysqlError(err) } return } // 关联非法奖品数据 func (s *RewardNotify) _errData(record *model.FissionRewardRecord) (err error) { m := s.GetDao().FissionRewardRecord _, err = m.WithContext(s.Ctx).Where(m.ID.Eq(record.ID)). UpdateSimple( m.Status.Value(mtype.FissionRewardRecordStatusFail), m.FailType.Value(mtype.FissionRewardRecordFailTypeCli), m.FailMsg.Value("关联非法奖品数据"), ) if err != nil { return s.BE().MysqlError(err) } sm := s.GetDao().FissionRewardRecord.SubTable(record.CampaignID) _, err = sm.WithContext(s.Ctx).Where(sm.ID.Eq(record.ID)). UpdateSimple( sm.Status.Value(mtype.FissionRewardRecordStatusFail), sm.FailType.Value(mtype.FissionRewardRecordFailTypeCli), sm.FailMsg.Value("关联非法奖品数据"), ) if err != nil { return s.BE().MysqlError(err) } if record.MallRecordID > 0 { mallRecordM := s.GetDao().RedeemMallRecord _, err = mallRecordM. WithContext(s.Ctx). Where(mallRecordM.ID.Eq(record.MallRecordID)). UpdateSimple( mallRecordM.Status.Value(mtype.RedeemMallRecordStatusFail), mallRecordM.FailType.Value(mtype.RewardPushFailTypeCli), mallRecordM.FailMsg.Value("关联非法奖品数据"), ) if err != nil { return s.BE().MysqlError(err) } } return } func (s *RewardNotify) campaign() (cpn *model.FissionCampaign, user *model.FissionUser, err error) { cpn, err = finder.Campaign(s.Ctx, s.Req.CampaignId) if err != nil { err = s.BE().CacheError(err) return } if cpn == nil { err = workerr.NotFound("not found cpn") return } user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.UserId) if err != nil { err = s.BE().CacheError(err) return } if user == nil { err = workerr.NotFound("not found user") return } return }