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.
305 lines
8.1 KiB
Go
305 lines
8.1 KiB
Go
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
|
|
}
|