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.

184 lines
4.0 KiB
Go

package campaign
import (
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign"
)
type ChildShow struct {
logic.Logic
Req *pb.ChildShowReq
Res *pb.ChildShowRes
ruleMap map[int64]*model.FissionCampaignRewardRule
}
func (s *ChildShow) Run() error {
return logic.Run(s)
}
func (s *ChildShow) Exec() (err error) {
cpn, err := s.setCampaign()
if err != nil {
return
}
err = s.setRewards(cpn)
if err != nil {
return
}
return
}
func (s *ChildShow) setCampaign() (cpn *model.FissionCampaign, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetId(), s.Req.GetHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
conf, err := cache.NewCampaignConfig(s.Ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
s.AddAfterRun(func() (err error) {
s.Res.Title = cpn.Title
s.Res.ChildType = int32(cpn.ChildType)
s.Res.FissionId = cpn.FissionID
s.Res.TStart = cpn.TStart
s.Res.TEnd = cpn.TEnd
s.Res.PlayType = int32(conf.PlayType)
return
})
return
}
func (s *ChildShow) setRewards(cpn *model.FissionCampaign) (err error) {
m := s.GetDao().FissionCampaignReward
list, err := m.WithContext(s.Ctx).Where(
m.CampaignID.Eq(cpn.ID),
m.IsDel.Eq(mtype.No),
).Order(m.Sort).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
s.Res.Rewards = make([]*pb.ChildShowRes_Reward, 0, len(list))
var rewardIds []int64
for _, v := range list {
rewardIds = append(rewardIds, v.RewardID)
}
preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, rewardIds...)
if err != nil {
return
}
var langMark string
if cpn.Pid > 0 {
var pcpn *model.FissionCampaign
pcpn, err = cache.NewCampaign(s.Ctx).FindById(cpn.Pid)
if err != nil {
err = s.BE().CacheError(err)
return
}
langMark = mtype.FissionLangTypeToMark[pcpn.GetLangTypes()[0]]
}
for _, v := range list {
one := &pb.ChildShowRes_Reward{
Id: v.ID,
RewardId: v.RewardID,
Stock: v.Stock,
InviteNum: v.InviteNum,
RewardNum: v.RewardNum,
IsThank: int32(v.IsThank),
Score: v.Score,
SignDay: v.SignDay,
CollectNum: v.CollectNum,
IsSuper: int32(v.IsSuper),
KvData: nil,
Title: "",
ImgUrl: "",
ReceiveType: 0,
Contact: "",
Url: "",
Help: 0,
HelpPercent: 0,
Click: 0,
ClickPercent: 0,
ClickPercentLimit: 0,
Open: 0,
OpenPercent: 0,
OpenPercentLimit: 0,
LangMark: "",
Odds: v.Odds,
JumpUrl: v.JumpURL,
FormTitle: "",
CampaignLimit: 0,
Register: 0,
RegisterPercent: 0,
InitPercent: v.InitPercent,
PropMark: v.PropMark,
}
info, _ := preward.InfoAutoLang(v.RewardID, langMark)
one.ReceiveType = info.ReceiveType
one.Contact = info.Contact
one.Url = info.Url
one.FormTitle = info.FormTitle
for _, kv := range info.KvData {
one.KvData = append(one.KvData, &pb.ChildShowRes_KV{
Key: kv.Key,
Value: kv.Value,
})
}
one.Title, one.ImgUrl, one.LangMark = info.Title, info.ImgUrl, info.Mark
if rule, ok := s.ruleMap[v.ID]; ok {
one.CampaignLimit = rule.CampaignLimit
}
s.Res.Rewards = append(s.Res.Rewards, one)
}
return
}
func (s *ChildShow) _ruleMap(cpn *model.FissionCampaign) (err error) {
ruleM := s.GetDao().FissionCampaignRewardRule
rules, err := ruleM.WithContext(s.Ctx).Where(ruleM.CampaignID.Eq(cpn.ID)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var ruleMap = make(map[int64]*model.FissionCampaignRewardRule, len(rules))
for _, v := range rules {
ruleMap[v.RewardID] = v
}
s.ruleMap = ruleMap
return
}