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.
241 lines
5.5 KiB
Go
241 lines
5.5 KiB
Go
package campaignstat
|
|
|
|
import (
|
|
"joybuywork/internal/consts"
|
|
"joybuywork/internal/repository/cache"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/service/provider/fissionaction"
|
|
"joybuywork/internal/utils/logic"
|
|
"joybuywork/internal/utils/verify"
|
|
pb "joybuywork/proto/go_proto/w_campaign_stat"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
)
|
|
|
|
type ReportInfo struct {
|
|
logic.Logic
|
|
Req *pb.ReportInfoReq
|
|
Res *pb.ReportInfoRes
|
|
}
|
|
|
|
func (s *ReportInfo) Run() error {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *ReportInfo) Exec() (err error) {
|
|
cpn, conf, err := s.campaign()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.langOffset(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.ticket(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = s.fission(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return s.events(cpn, conf)
|
|
}
|
|
|
|
// 活动数据
|
|
func (s *ReportInfo) campaign() (cpn *model.FissionCampaign, conf *model.FissionCampaignConfig, err error) {
|
|
cpn, err = finder.Campaign(s.Ctx, s.Req.GetHashId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if cpn == nil || cpn.IsDel == mtype.Yes {
|
|
err = workerr.NotFound("campaign not found")
|
|
return
|
|
}
|
|
|
|
conf, err = cache.NewCampaignConfig(s.Ctx).FindByCampaignId(cpn.ID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
s.Res.HashId = cpn.HashID
|
|
s.Res.Title = cpn.Title
|
|
s.Res.CoverUrl = cpn.CoverURL
|
|
s.Res.FissionMark = consts.FissionIdMap[cpn.FissionID]
|
|
s.Res.StartTime = cpn.TStart
|
|
s.Res.EndTime = cpn.TEnd
|
|
s.Res.Status = int32(cpn.Status)
|
|
s.Res.TOffset = cpn.TOffset
|
|
s.Res.Target = int32(cpn.Target)
|
|
s.Res.RewardType = []string{"app"}
|
|
|
|
return
|
|
}
|
|
|
|
// 语言时区
|
|
func (s *ReportInfo) langOffset(cpn *model.FissionCampaign) (err error) {
|
|
if len(cpn.GetLangMarks()) == 1 {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionCampaignLang
|
|
langs, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
s.Res.LangOffset = make([]*pb.ReportInfoRes_LangOffset, 0, len(langs)+2)
|
|
|
|
s.Res.LangOffset = append(s.Res.LangOffset, &pb.ReportInfoRes_LangOffset{
|
|
TOffset: cpn.TOffset,
|
|
LangMark: "",
|
|
}, &pb.ReportInfoRes_LangOffset{
|
|
TOffset: cpn.TOffset,
|
|
LangMark: cpn.GetLangMarks()[0],
|
|
})
|
|
|
|
for _, lang := range langs {
|
|
s.Res.LangOffset = append(s.Res.LangOffset, &pb.ReportInfoRes_LangOffset{
|
|
TOffset: lang.TOffset,
|
|
LangMark: lang.LangMark,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ReportInfo) events(cpn *model.FissionCampaign, conf *model.FissionCampaignConfig) (err error) {
|
|
temp, err := cache.NewFissionTemp(s.Ctx).FindById(cpn.TemplateID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
group, err := cache.NewFissionTempGroup(s.Ctx).FindById(temp.GroupID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
pfa := fissionaction.NewActionList(s.Ctx, cpn, conf, group)
|
|
fixDms := pfa.GetFixDimension()
|
|
|
|
s.Res.FixDimensions = make([]*pb.ReportInfoRes_Dimension, 0, len(fixDms))
|
|
for _, v := range fixDms {
|
|
s.Res.FixDimensions = append(s.Res.FixDimensions, &pb.ReportInfoRes_Dimension{
|
|
Key: v,
|
|
})
|
|
}
|
|
|
|
actions := pfa.GetFissionAction()
|
|
s.Res.Events = make([]*pb.ReportInfoRes_Event, 0, len(actions))
|
|
for _, v := range actions {
|
|
|
|
dms := pfa.GetDimension(v)
|
|
one := &pb.ReportInfoRes_Event{
|
|
Type: v,
|
|
Dimensions: make([]*pb.ReportInfoRes_Dimension, 0, len(dms)),
|
|
}
|
|
|
|
for _, d := range dms {
|
|
one.Dimensions = append(one.Dimensions, &pb.ReportInfoRes_Dimension{
|
|
Key: d,
|
|
})
|
|
}
|
|
|
|
s.Res.Events = append(s.Res.Events, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ReportInfo) ticket(cpn *model.FissionCampaign) (err error) {
|
|
m := s.GetDao().FissionCampaignTicket
|
|
|
|
list, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.Open.Eq(mtype.Yes)).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
switch v.Mark {
|
|
case mtype.FissionCampaignTicketCustom:
|
|
s.Res.OpenCustom = 1
|
|
case mtype.FissionCampaignTicketFixed:
|
|
s.Res.OpenFixed = 1
|
|
}
|
|
}
|
|
|
|
if verify.InArray[int64](cpn.FissionID, consts.IdWinTogether, consts.IdReferral) {
|
|
s.Res.OpenFixed = 1
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ReportInfo) fission(cpn *model.FissionCampaign) (err error) {
|
|
switch cpn.FissionID {
|
|
case consts.IdKeep:
|
|
return s._keep(cpn)
|
|
case consts.IdReferral:
|
|
return s._referral(cpn)
|
|
case consts.IdWinTogether:
|
|
return s._win(cpn)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ReportInfo) _keep(cpn *model.FissionCampaign) (err error) {
|
|
s.Res.RewardType = append(s.Res.RewardType, "step")
|
|
s.Res.ShowSelect = 1
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ReportInfo) _referral(cpn *model.FissionCampaign) (err error) {
|
|
s.Res.ShowAll = 1
|
|
|
|
m := s.GetDao().FissionCampaignReward
|
|
info, err := m.WithContext(s.Ctx).Select(m.ID).Where(m.CampaignID.Eq(cpn.ID), m.RewardType.Eq(mtype.FissionCampaignRewardTypeExtra), m.IsDel.Eq(mtype.No)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if info != nil {
|
|
s.Res.RewardType = append(s.Res.RewardType, "extra")
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ReportInfo) _win(cpn *model.FissionCampaign) (err error) {
|
|
s.Res.RewardType = append(s.Res.RewardType, "newcomer")
|
|
s.Res.ShowAll = 1
|
|
|
|
m := s.GetDao().FissionCampaignReward
|
|
info, err := m.WithContext(s.Ctx).Select(m.ID).Where(m.CampaignID.Eq(cpn.ID), m.RewardType.Eq(mtype.FissionCampaignRewardTypeExtra), m.IsDel.Eq(mtype.No)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if info != nil {
|
|
s.Res.RewardType = append(s.Res.RewardType, "extra")
|
|
}
|
|
|
|
return
|
|
}
|