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

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
}