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

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
}