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.

286 lines
6.6 KiB
Go

package containers
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/provider"
"joybuywork/internal/service/provider/award"
"joybuywork/internal/service/provider/fissionaction"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_fission_web"
"joybuywork/proto/go_proto/workerr"
"time"
ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice"
)
type FissionWebWebReward struct {
logic.Logic
Req *pb.WebRewardReq
Res *pb.WebRewardRes
}
func (s *FissionWebWebReward) Run() error {
return logic.Run(s)
}
func (s *FissionWebWebReward) Exec() (err error) {
cpn, err := s.cpn()
if err != nil {
return
}
binder, err := s.wbu(cpn)
if err != nil || binder == nil {
return
}
wbu, user, err := s.bind(cpn, binder)
if err != nil || wbu == nil {
return
}
err = s.webReward(cpn, wbu, user)
if err != nil {
return
}
return
}
func (s *FissionWebWebReward) cpn() (cpn *model.FissionCampaign, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found cpn")
return
}
return
}
func (s *FissionWebWebReward) wbu(cpn *model.FissionCampaign) (binder *model.FissionWebUser, err error) {
res, _ := app.NewDeepLinkDevice().FindBlackbox(s.Ctx, &ddevicepb.FindBlackboxReq{
Blackbox: s.Req.GetWebId(),
ProjectId: cpn.ProjectID,
})
if res.GetWid() == "" {
return
}
binder, err = cache.NewFissionWebUser(s.Ctx).FindByWebId(cpn.ID, res.GetWid())
if err != nil {
err = s.BE().CacheError(err)
return
}
return
}
func (s *FissionWebWebReward) bind(cpn *model.FissionCampaign, binder *model.FissionWebUser) (*model.FissionWebUser, *model.FissionUser, error) {
// 已经绑定了用户就不显示了
if binder.UserID > 0 || binder.RewardID == 0 {
s.Res.Status = 2
return binder, nil, nil
}
binder, user, err := s._bindUser(cpn, binder)
if err != nil {
return nil, nil, err
}
if user == nil {
return binder, nil, nil
}
cc := cache.NewFissionWebUser(s.Ctx)
// 看看这个用户id有没有绑定过站外用户
wbuM := s.GetDao().FissionWebUser
hasBind, err := wbuM.WithContext(s.Ctx).Where(wbuM.CampaignID.Eq(cpn.ID), wbuM.UserID.Eq(user.ID)).Take()
if err = dbcheck.DbError(err); err != nil {
return nil, nil, s.BE().MysqlError(err)
}
// 如果已经绑定上了,就直接不允许领奖
if hasBind != nil {
s.Res.Status = 1
return binder, nil, nil
}
_, err = wbuM.WithContext(s.Ctx).Where(wbuM.ID.Eq(binder.ID)).UpdateSimple(wbuM.UserID.Value(user.ID))
if err != nil {
return nil, nil, s.BE().MysqlError(err)
}
_ = cc.Clear(binder)
return binder, user, nil
}
func (s *FissionWebWebReward) _bindUser(cpn *model.FissionCampaign, binder *model.FissionWebUser) (*model.FissionWebUser, *model.FissionUser, error) {
if s.Req.GetUid() == "" {
return binder, nil, nil
}
cc := cache.NewFissionWebUser(s.Ctx)
user, err := cache.NewFissionUser(s.Ctx, cpn.ID).FindBySubUserId(s.Req.GetUid())
if err != nil {
return nil, nil, s.BE().CacheError(err)
}
userBind, err := cc.FindByUserId(cpn.ID, user.ID)
if err != nil {
return nil, nil, s.BE().CacheError(err)
}
// 当前用户并没有领奖
if userBind == nil {
return binder, user, nil
}
_, err = s._setReward(cpn, binder, user)
if err != nil {
return nil, nil, err
}
s.Res.Status = 2
return nil, nil, nil
}
func (s *FissionWebWebReward) _setReward(cpn *model.FissionCampaign, wbu *model.FissionWebUser, user *model.FissionUser) (reward *model.FissionCampaignReward, err error) {
rewardM := s.GetDao().FissionCampaignReward
reward, err = rewardM.WithContext(s.Ctx).Where(rewardM.ID.Eq(wbu.RewardID)).Take()
if err = dbcheck.DbError(err); err != nil {
return
}
if reward == nil {
return
}
preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, reward.RewardID)
if err != nil {
return
}
var lang = s.Req.GetLang()
if user != nil {
lang = user.LangMark
}
lang = utils.NotExistGetFirst(lang, cpn.GetLangMarks())
info, err := preward.InfoAutoLang(reward.RewardID, lang)
if err != nil {
return
}
s.AddAfterRun(func() (err error) {
s.Res.HasReward = true
s.Res.Title = info.Title
s.Res.ImgUrl = info.ImgUrl
s.Res.ReceiveType = info.ReceiveType
s.Res.Contact = info.Contact
s.Res.WebUrl = info.WebUrl
s.Res.AppParam = info.AppParam
s.Res.PcParam = info.PcParam
s.Res.KvData = make([]*pb.WebRewardRes_KV, 0, len(info.KvData))
for _, kv := range info.KvData {
s.Res.KvData = append(s.Res.KvData, &pb.WebRewardRes_KV{
Key: kv.Key,
Value: kv.Value,
})
}
return
})
return
}
func (s *FissionWebWebReward) webReward(cpn *model.FissionCampaign, wbu *model.FissionWebUser, user *model.FissionUser) (err error) {
reward, err := s._setReward(cpn, wbu, user)
if err != nil {
return
}
// 找不到用户,只返回当前浏览器用户的奖品数据
if user == nil {
return
}
var record *model.FissionRewardRecord
var async []func()
defer s.AddAfterRun(func() (err error) {
if record != nil {
s.Res.RewardId = record.RewardID
s.Res.RewardHashId = record.HashID
s.Res.IsPush = record.Status != mtype.FissionRewardRecordStatusWait
if record.FailType == mtype.FissionRewardRecordFailTypeIneligible {
s.Res.Status = 1
}
}
for _, do := range async {
do()
}
return
})
var rewardType int8 = mtype.FissionCampaignRewardTypeWeb
if cpn.Target == mtype.FissionCampaignConfigTargetAdsGame {
rewardType = mtype.FissionCampaignRewardTypeApp
}
m := s.GetDao().FissionRewardRecord.SubTable(cpn.ID)
record, err = m.WithContext(s.Ctx).Where(
m.CampaignID.Eq(user.CampaignID),
m.UserID.Eq(user.ID),
m.RewardType.Eq(rewardType),
).Take()
if err = dbcheck.DbError(err); err != nil {
return s.BE().MysqlError(err)
}
if record != nil {
return
}
var opts []award.RecordOption
if user.IsNew == mtype.No {
opts = append(opts, award.RewardRecordStatus(
mtype.FissionRewardRecordStatusFail,
mtype.FissionRewardRecordFailTypeIneligible,
mtype.FissionRewardRecordFailTypeNotInstall,
))
}
record, _, async, err = award.NewAwardReward(s.Ctx, s.GetDao(), cpn.ProjectID, user).One(reward, false, opts...)
if err != nil {
return
}
if user.IsNew == mtype.Yes {
if cpn.ReportType == mtype.FissionCampaignReportTypeNew {
fissionaction.NewMarkPoint(s.Ctx).InApp(user).WebToApp(time.Now().Unix(), reward.ID, record.ID, wbu.WebID)
}
}
return
}