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.

2011 lines
47 KiB
Go

package service
import (
"joybuywork/internal/app"
"joybuywork/internal/config"
"joybuywork/internal/consts"
"joybuywork/internal/consts/ckey"
"joybuywork/internal/plugins/jsonm"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/cmm"
containers "joybuywork/internal/service/containers/campaign"
"joybuywork/internal/service/provider"
"joybuywork/internal/service/provider/fissionaction"
"joybuywork/internal/service/provider/operatelog"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils"
"joybuywork/internal/utils/blink"
"joybuywork/internal/utils/logic"
"joybuywork/internal/utils/timez"
"joybuywork/internal/utils/verify"
pb "joybuywork/proto/go_proto/w_campaign"
"joybuywork/proto/go_proto/workerr"
"time"
"gorm.io/gen"
"gorm.io/gen/field"
)
type WCampaign struct {
Service
}
// List 活动列表
func (s *WCampaign) List(req *pb.ListReq, res *pb.ListRes) (err error) {
defer s.checkErr()
*res = pb.ListRes{}
container := new(containers.List)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// Status 修改状态
func (s *WCampaign) Status(req *pb.StatusReq, res *pb.StatusRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetId(), req.GetHashId())
if err != nil {
return s.BE().CacheError(err)
}
if cpn == nil || cpn.IsDel == mtype.Yes {
return workerr.NotFound("campaign not found")
}
*res = pb.StatusRes{}
//活动已经下线了,直接返回成功,什么都不干
if cpn.Status == mtype.FissionCampaignStatusCancel {
return
}
// 想下线,但是没发布
if req.Status == mtype.FissionCampaignStatusCancel && !cpn.IsPub() {
return workerr.CWaitCancelError
}
// 想上线,但是不是预发布状态
if verify.InArray[int32](req.Status, mtype.FissionCampaignStatusPub, mtype.FissionCampaignStatusPubPre) && cpn.Status != mtype.FissionCampaignStatusPubPre {
return workerr.CPubWaitError
}
m := s.GetDao().FissionCampaign
var up = []field.AssignExpr{
m.Status.Value(int8(req.GetStatus())),
}
if req.PreRunTime > 0 {
up = append(up, m.PreToRun.Value(timez.GMT(req.PreRunTime, cpn.TOffset)))
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(cpn.ID)).UpdateSimple(up...)
if err != nil {
return s.BE().MysqlError(err)
}
err = cache.NewCampaign(s.ctx).Clear(cpn)
if err != nil {
err = s.BE().CacheError(err)
return
}
switch req.Status {
case mtype.FissionCampaignStatusPub:
var conf *model.FissionCampaignConfig
conf, err = cache.NewCampaignConfig(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
confM := s.GetDao().FissionCampaignConfig
_, err = confM.WithContext(s.ctx).Where(confM.ID.Eq(conf.ID)).UpdateSimple(confM.HasWhite.Value(mtype.No))
if err != nil {
return s.BE().MysqlError(err)
}
_ = cache.NewCampaignConfig(s.ctx).Clear(conf)
producer.NewDeepworkNotify(s.ctx).CampaignStart(types.DnCampaignStart{
CampaignId: cpn.ID,
CampaignHashId: cpn.HashID,
Timestamp: time.Now().Unix(),
})
case mtype.FissionCampaignStatusCancel:
err = cmm.NewCMM(s.ctx, s.GetDao()).CampaignCancelTask(cpn, true)
if err != nil {
return
}
producer.NewDeepworkNotify(s.ctx).CampaignEnd(types.DnCampaignEnd{
CampaignId: cpn.ID,
CampaignHashId: cpn.HashID,
Timestamp: time.Now().Unix(),
})
default:
}
return
}
// Destroy 删除活动
func (s *WCampaign) Destroy(req *pb.DestroyReq, res *pb.DestroyRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetId(), req.GetHashId())
if err != nil {
return s.BE().CacheError(err)
}
*res = pb.DestroyRes{}
if cpn == nil || cpn.IsDel == mtype.Yes {
return
}
m := s.GetDao().FissionCampaign
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(cpn.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
if err != nil {
return s.BE().MysqlError(err)
}
err = cache.NewCampaign(s.ctx).Clear(cpn)
if err != nil {
return
}
// 待发布的活动的一些数据要停止处理
if cpn.Status == mtype.FissionCampaignStatusWait {
err = cmm.NewCMM(s.ctx, s.GetDao()).CampaignCancelTask(cpn, true)
if err != nil {
return
}
}
producer.NewOplatformOther(s.ctx).OpoCampaignDelete(types.OpoCampaignDelete{
ProjectId: cpn.ProjectID,
CampaignHashId: cpn.HashID,
}, producer.SetHeaderLang(cpn.GetLangMarks()[0]))
return
}
// Store 创建活动
func (s *WCampaign) Store(req *pb.StoreReq, res *pb.StoreRes) (err error) {
defer s.checkErr()
*res = pb.StoreRes{}
container := new(containers.Store)
{
container.Init(s.ctx, logic.WithTran(), logic.WithOl())
container.Req = req
container.Res = res
}
err = container.Run()
return
}
// Share 社媒选项
func (s *WCampaign) Share(req *pb.ShareReq, res *pb.ShareRes) (err error) {
defer s.checkErr()
loc, overSea := consts.ShareLocList, consts.ShareOverSeaList
*res = pb.ShareRes{
Loc: make([]*pb.ShareRes_One, 0, len(loc)),
OverSea: make([]*pb.ShareRes_One, 0, len(overSea)),
}
for _, v := range loc {
if v.Close {
continue
}
res.Loc = append(res.Loc, &pb.ShareRes_One{
Id: v.Id,
Title: v.Title,
Logo: v.Logo,
Scheme: v.Scheme,
IosScheme: v.IosScheme,
})
}
for _, v := range overSea {
if v.Close {
continue
}
res.OverSea = append(res.OverSea, &pb.ShareRes_One{
Id: v.Id,
Title: v.Title,
Logo: v.Logo,
Scheme: v.Scheme,
IosScheme: v.IosScheme,
})
}
return
}
// Show 活动详情
func (s *WCampaign) Show(req *pb.ShowReq, res *pb.ShowRes) (err error) {
defer s.checkErr()
*res = pb.ShowRes{}
container := new(containers.Show)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
err = container.Run()
return
}
// ChannelList 渠道列表
func (s *WCampaign) ChannelList(req *pb.ChannelListReq, res *pb.ChannelListRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetCampaignId(), req.GetCampaignHashId())
if err != nil {
return s.BE().CacheError(err)
}
if cpn == nil || cpn.IsDel == mtype.Yes {
return workerr.NotFound("not found campaign")
}
project, err := finder.Project(s.ctx, cpn.ProjectID)
if err != nil {
return s.BE().CacheError(err)
}
if project == nil || project.IsDel == mtype.Yes {
return workerr.NotFound("not found project")
}
m := s.GetDao().FissionCampaignChannel
list, err := m.WithContext(s.ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Order(m.ID).Find()
if err != nil {
return s.BE().MysqlError(err)
}
var cll, cwl int
for _, v := range list {
switch v.CType {
case mtype.FissionCampaignChannelTypeApp:
cll++
case mtype.FissionCampaignChannelTypeWeb:
cwl++
}
}
*res = pb.ChannelListRes{
List: make([]*pb.ChannelListRes_One, 0, cll),
WebList: make([]*pb.ChannelListRes_One, 0, cwl),
}
for _, v := range list {
switch v.CType {
case mtype.FissionCampaignChannelTypeApp:
var url string
switch cpn.Target {
case mtype.FissionCampaignConfigTargetAdsGame:
url = blink.NewAdsLink(project.Domain, cpn.HashID, v.Mark).CampaignShareLink()
default:
url = blink.NewCampaignLink(project.Domain, cpn.HashID, v.Mark).CampaignShareLink()
}
res.List = append(res.List, &pb.ChannelListRes_One{
Id: v.ID,
Title: v.Title,
IsDefault: int32(v.IsDefault),
Url: url,
})
case mtype.FissionCampaignChannelTypeWeb:
url := v.ShortLink
if url == "" {
url = blink.NewCampaignLink(project.Domain, cpn.HashID, v.Mark).CampaignWebLink()
}
res.WebList = append(res.WebList, &pb.ChannelListRes_One{
Id: v.ID,
Title: v.Title,
IsDefault: int32(v.IsDefault),
Url: url,
Code: v.Code,
})
}
}
return
}
// ChannelCreate 渠道创建
func (s *WCampaign) ChannelCreate(req *pb.ChannelCreateReq, res *pb.ChannelCreateRes) (err error) {
defer s.checkErr()
*res = pb.ChannelCreateRes{}
container := new(containers.ChannelCreate)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// ChannelUpdate 渠道更新
func (s *WCampaign) ChannelUpdate(req *pb.ChannelUpdateReq, res *pb.ChannelUpdateRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignChannel
cl, err := m.WithContext(s.ctx).Where(m.ID.Eq(req.GetId())).Take()
if err = dbcheck.DbError(err); err != nil {
return s.BE().MysqlError(err)
}
if cl == nil || cl.IsDel == mtype.Yes {
return workerr.NotFound("not found channel")
}
if cl.IsDefault == mtype.Yes {
return workerr.CChanelNotSetError
}
*res = pb.ChannelUpdateRes{}
if cl.Title == req.GetTitle() {
return
}
var title []string
err = m.WithContext(s.ctx).Where(m.CampaignID.Eq(cl.CampaignID), m.ID.Neq(cl.ID), m.CType.Eq(cl.CType), m.IsDel.Eq(mtype.No)).Pluck(m.Title, &title)
if err != nil {
return s.BE().MysqlError(err)
}
for _, v := range title {
if v == req.GetTitle() {
return workerr.CChanelExistError
}
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(cl.ID)).UpdateSimple(m.Title.Value(req.GetTitle()))
if err != nil {
return s.BE().MysqlError(err)
}
cpn, _ := cache.NewCampaign(s.ctx).FindById(cl.CampaignID)
cpnM := s.GetDao().FissionCampaign
cpnM.WithContext(s.ctx).Where(cpnM.ID.Eq(cl.CampaignID)).UpdateSimple(cpnM.UpdatedAt.Value(time.Now().Unix()))
cache.NewCampaign(s.ctx).Clear(cpn)
_ = cache.NewCampaignChannel(s.ctx).Clear(cl)
return
}
// ChannelDestroy 渠道删除
func (s *WCampaign) ChannelDestroy(req *pb.ChannelDestroyReq, res *pb.ChannelDestroyRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignChannel
cl, err := m.WithContext(s.ctx).Where(m.ID.Eq(req.GetId())).Take()
if err = dbcheck.DbError(err); err != nil {
return s.BE().MysqlError(err)
}
if cl == nil || cl.IsDel == mtype.Yes {
return
}
if cl.IsDefault == mtype.Yes {
return workerr.CChanelNotSetError
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(cl.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
if err != nil {
return s.BE().MysqlError(err)
}
cpn, _ := cache.NewCampaign(s.ctx).FindById(cl.CampaignID)
cpnM := s.GetDao().FissionCampaign
cpnM.WithContext(s.ctx).Where(cpnM.ID.Eq(cl.CampaignID)).UpdateSimple(cpnM.UpdatedAt.Value(time.Now().Unix()))
cache.NewCampaign(s.ctx).Clear(cpn)
_ = cache.NewCampaignChannel(s.ctx).Clear(cl)
*res = pb.ChannelDestroyRes{}
return
}
// Update 更新活动
func (s *WCampaign) Update(req *pb.UpdateReq, res *pb.UpdateRes) (err error) {
defer s.checkErr()
*res = pb.UpdateRes{}
container := new(containers.Update)
{
container.Init(s.ctx, logic.WithTran(), logic.WithOl())
container.Req = req
container.Res = res
}
err = container.Run()
return
}
// KvData 获取活动键值对
func (s *WCampaign) KvData(req *pb.KvDataReq, res *pb.KvDataRes) (err error) {
defer s.checkErr()
conf, err := cache.NewCampaignConfig(s.ctx).FindByCampaignId(req.GetId())
if err != nil {
return s.BE().CacheError(err)
}
if conf == nil {
return workerr.NotFound("not found campaign")
}
kv := conf.GetCampaignData()
*res = pb.KvDataRes{
Kv: make([]*pb.KvDataRes_KV, 0, len(kv)),
}
for _, v := range kv {
res.Kv = append(res.Kv, &pb.KvDataRes_KV{
Key: v.Key,
Value: v.Value,
})
}
return
}
// Cert 认证活动信息
func (s *WCampaign) Cert(req *pb.CertReq, res *pb.CertRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetId(), req.GetHashId())
if err != nil {
return s.BE().CacheError(err)
}
project, err := finder.Project(s.ctx, req.GetProjectId(), req.GetProjectHashId())
if err != nil {
return s.BE().CacheError(err)
}
if cpn == nil || cpn.IsDel == mtype.Yes || project == nil || project.IsDel == mtype.Yes || cpn.ProjectID != project.ID {
return
}
*res = pb.CertRes{
Cert: true,
Id: cpn.ID,
HashId: cpn.HashID,
ProjectId: project.ID,
ProjectHashId: project.HashID,
Title: cpn.Title,
}
return
}
// Barrage 活动弹幕
func (s *WCampaign) Barrage(req *pb.BarrageReq, res *pb.BarrageRes) (err error) {
defer s.checkErr()
*res = pb.BarrageRes{}
container := new(containers.Barrage)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// Option 投票选项
func (s *WCampaign) Option(req *pb.OptionReq, res *pb.OptionRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetId(), req.GetHashId())
if err != nil {
return s.BE().CacheError(err)
}
if cpn == nil {
return workerr.NotFound("not found cpn")
}
fcqM := s.GetDao().FissionCampaignQuiz
fcq, err := fcqM.WithContext(s.ctx).Where(fcqM.CampaignID.Eq(cpn.ID)).Take()
if err = dbcheck.DbError(err); err != nil {
return s.BE().MysqlError(err)
}
if fcq == nil {
return workerr.NotFound("not found fcq")
}
optionM := s.GetDao().FissionCampaignQuizOption
options, err := optionM.WithContext(s.ctx).Where(optionM.CampaignID.Eq(cpn.ID), optionM.IsDel.Eq(mtype.No)).Order(optionM.VoteNum.Desc(), optionM.ID).Find()
if err != nil {
return s.BE().MysqlError(err)
}
*res = pb.OptionRes{}
var rightId int64
for _, v := range options {
res.Options = append(res.Options, &pb.OptionRes_Option{
Id: v.ID,
Title: v.Title,
ImgUrl: v.ImgURL,
IsRight: int32(v.IsRight),
VoteNum: v.VoteNum,
})
if v.IsRight == mtype.Yes {
rightId = v.ID
}
}
if fcq.OpenType != mtype.FissionCampaignQuizOpenTypeWait {
res.RightId = rightId
}
return
}
// RelateDdl 活动关联动态下载页
func (s *WCampaign) RelateDdl(req *pb.RelateDdlReq, res *pb.RelateDdlRes) (err error) {
defer s.checkErr()
*res = pb.RelateDdlRes{}
project, err := finder.Project(s.ctx, req.GetProjectHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if project == nil || project.IsDel == mtype.Yes {
err = workerr.NotFound("not found project")
return
}
cpn, err := finder.Campaign(s.ctx, req.GetHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found campaign")
return
}
conf, err := cmm.NewCMM(s.ctx, s.dao).GetFissionConfig(project.ID)
if err != nil {
return
}
m := s.GetDao().FissionConfig
// 关闭动态下载页
if req.GetClose() {
if conf.DynamicCampaign == cpn.ID {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(conf.ID)).UpdateSimple(m.DynamicCampaign.Value(0))
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
return
}
// 等值不用修改
if conf.DynamicCampaign == cpn.ID {
return
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(conf.ID)).UpdateSimple(m.DynamicCampaign.Value(cpn.ID))
if err != nil {
err = s.BE().MysqlError(err)
return
}
return
}
// DdlCampaign 关联动态下载页的活动
func (s *WCampaign) DdlCampaign(req *pb.DdlCampaignReq, res *pb.DdlCampaignRes) (err error) {
defer s.checkErr()
project, err := finder.Project(s.ctx, req.GetProjectHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if project == nil || project.IsDel == mtype.Yes {
err = workerr.NotFound("not found project")
return
}
conf, err := cmm.NewCMM(s.ctx, s.dao).GetFissionConfig(project.ID)
if err != nil {
return
}
if conf.DynamicCampaign == 0 {
return
}
cpn, err := finder.Campaign(s.ctx, conf.DynamicCampaign)
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found campaign")
return
}
*res = pb.DdlCampaignRes{
HashId: cpn.HashID,
Title: cpn.Title,
Status: int32(cpn.Status),
}
return
}
// Langs 活动多语言配置信息
func (s *WCampaign) Langs(req *pb.LangsReq, res *pb.LangsRes) (err error) {
defer s.checkErr()
*res = pb.LangsRes{}
container := new(containers.Langs)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// Lang 活动语言信息
func (s *WCampaign) Lang(req *pb.LangReq, res *pb.LangRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetCampaignId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found campaign")
return
}
project, err := s.ProjectErrNil(cpn.ProjectID)
if err != nil {
return
}
conf, err := cache.NewCampaignConfig(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
var langMark = utils.NotExistGetFirst(req.GetLangMark(), cpn.GetLangMarks())
lang, err := cache.NewCampaignLang(s.ctx).FindByCampaignId(cpn.ID, langMark)
if err != nil {
err = s.BE().CacheError(err)
return
}
if lang == nil {
return
}
*res = pb.LangRes{
HashId: lang.HashID,
PageTitle: lang.PageTitle,
ImageMain: lang.ImageMain,
DownloadPageImage: lang.DownloadPageImage,
WechatPageImage: lang.WechatPageImage,
ContentImg: lang.ContentImg,
WebBgImg: lang.WebBgImg,
WarmUpImg: lang.WarmUpImg,
DlBgImg: lang.DlBgImg,
DlBannerImg: lang.DlBannerImg,
DlBannerAppLogo: lang.DlBannerAppLogo,
DlBannerAppName: lang.DlBannerAppName,
DlBannerAppBtn: lang.DlBannerAppBtn,
ShareText: lang.ShareText,
ShareImg: lang.ShareImg,
Rule: lang.Rule,
Conds: nil,
Quit: nil,
Questions: nil,
LongImgs: nil,
Cash: nil,
TOffset: lang.TOffset,
QaGroup: nil,
TalkText: nil,
Gold: nil,
Coin: nil,
TopicColor: lang.TopicColor,
PcBg: lang.PcBg,
RuleImg: lang.RuleImg,
}
for _, cond := range lang.GetConds() {
res.Conds = append(res.Conds, &pb.LangRes_Cond{
CondId: cond.CondId,
Desc: cond.Desc,
WebUrl: cond.WebURL,
ExtraParam: cond.ExtraParam,
PcParam: cond.PcParam,
GoText: cond.GoText,
})
}
if quit := lang.GetQuit(); quit != nil {
res.Quit = &pb.LangRes_Quit{
Title: quit.Title,
Options: make([]*pb.LangRes_Option, 0, len(quit.Options)),
}
for _, option := range quit.Options {
res.Quit.Options = append(res.Quit.Options, &pb.LangRes_Option{
OptionId: option.OptionId,
Title: option.Title,
ImgUrl: option.ImgUrl,
})
}
}
for _, question := range lang.GetQuestions() {
q := &pb.LangRes_Question{
QaId: question.QaId,
Title: question.Title,
Options: make([]*pb.LangRes_Option, 0, len(question.Options)),
}
for _, option := range question.Options {
q.Options = append(q.Options, &pb.LangRes_Option{
OptionId: option.OptionId,
Title: option.Title,
ImgUrl: option.ImgUrl,
})
}
res.Questions = append(res.Questions, q)
}
var targetChannelMap = make(map[int64]*model.FissionCampaignChannel)
var targetCpnMap = make(map[int64]*model.FissionCampaign)
if conf.HasLongImg == mtype.Yes {
imgM := s.GetDao().FissionCampaignLongImg
var imgs []*model.FissionCampaignLongImg
imgs, err = imgM.WithContext(s.ctx).Where(imgM.CampaignID.Eq(lang.CampaignID), imgM.LangID.Eq(lang.ID), imgM.IsDel.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var cpnIds []int64
var zoneIds []int64
for _, img := range imgs {
if img.ClickType == mtype.FissionCampaignLongImgClickTypeAll {
if img.TargetType == mtype.FissionCampaignLongImgTargetTypeCampaign {
cpnIds = append(cpnIds, img.TargetID)
}
continue
}
zoneIds = append(zoneIds, img.ID)
}
var zoneMap = make(map[int64][]*model.FissionCampaignLongImgZone, len(zoneIds))
if len(zoneIds) > 0 {
zoneM := s.GetDao().FissionCampaignLongImgZone
var zones []*model.FissionCampaignLongImgZone
zones, err = zoneM.WithContext(s.ctx).Where(zoneM.ImgID.In(zoneIds...), zoneM.IsDel.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, zone := range zones {
zoneMap[zone.ImgID] = append(zoneMap[zone.ImgID], zone)
if zone.TargetType == mtype.FissionCampaignLongImgTargetTypeCampaign {
cpnIds = append(cpnIds, zone.TargetID)
}
}
}
if len(cpnIds) > 0 {
cpnM := s.GetDao().FissionCampaign
var cpns []*model.FissionCampaign
cpns, err = cpnM.WithContext(s.ctx).Where(cpnM.ID.In(cpnIds...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, v := range cpns {
targetCpnMap[v.ID] = v
}
channelM := s.GetDao().FissionCampaignChannel
var channels []*model.FissionCampaignChannel
channels, err = channelM.WithContext(s.ctx).Where(channelM.CampaignID.In(cpnIds...), channelM.IsDefault.Eq(mtype.Yes), channelM.IsDel.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, channel := range channels {
targetChannelMap[channel.CampaignID] = channel
}
}
for _, v := range imgs {
var one = &pb.LangRes_LongImg{
ImgUrl: v.ImgURL,
WebUrl: v.WebURL,
AppParam: v.AppParam,
Id: v.ID,
ClickType: int32(v.ClickType),
HotZone: make([]*pb.LangRes_HotZone, 0, len(zoneMap[v.ID])),
TargetType: int32(v.TargetType),
TargetId: v.TargetID,
TargetUrl: "",
PcParam: v.PcParam,
}
if v.TargetType == mtype.FissionCampaignLongImgTargetTypeCampaign {
one.TargetUrl = blink.NewCampaignLink(project.Domain, targetCpnMap[v.TargetID].HashID, targetChannelMap[v.TargetID].Mark).CampaignShareLink()
}
for _, zone := range zoneMap[v.ID] {
two := &pb.LangRes_HotZone{
Id: zone.ID,
WebUrl: zone.WebURL,
AppParam: zone.AppParam,
ClickX: zone.ClickX,
ClickY: zone.ClickY,
ClickW: zone.ClickW,
ClickH: zone.ClickH,
TargetType: int32(zone.TargetType),
TargetId: zone.TargetID,
TargetUrl: "",
PcParam: zone.PcParam,
}
if zone.TargetType == mtype.FissionCampaignLongImgTargetTypeCampaign {
two.TargetUrl = blink.NewCampaignLink(project.Domain, targetCpnMap[zone.TargetID].HashID, targetChannelMap[zone.TargetID].Mark).CampaignShareLink()
}
one.HotZone = append(one.HotZone, two)
}
res.LongImgs = append(res.LongImgs, one)
}
}
if cash := lang.GetCash(); cash != nil {
res.Cash = &pb.LangRes_Cash{
Price: cash.Price,
Currency: cash.Currency,
}
}
if gold := lang.GetGold(); gold != nil {
res.Gold = &pb.LangRes_Gold{
Price: gold.Price,
Currency: gold.Currency,
}
}
if coin := lang.GetLangCoin(); coin != nil {
res.Coin = &pb.LangRes_Coin{
CustomBtnText: coin.CustomBtnText,
CustomWebUrl: coin.CustomWebUrl,
CustomExtraParam: coin.CustomExtraParam,
CustomPcParam: coin.CustomPcParam,
}
}
if qaGroup := lang.GetQaGroup(); qaGroup != nil {
var title string
qaGroupM := s.GetDao().LibraryQaGroup
group, _ := qaGroupM.WithContext(s.ctx).Where(qaGroupM.HashID.Eq(qaGroup.QaGroupId)).Take()
if group != nil {
title = group.Title
}
res.QaGroup = &pb.LangRes_QaGroup{
QaGroupId: qaGroup.QaGroupId,
QaNum: qaGroup.QaNum,
Title: title,
GuideGroupId: qaGroup.GuideGroupId,
}
}
if langVs := lang.GetVs(); langVs != nil {
var langScheduleMap = make(map[int64]*pb.LangRes_PkTeam, len(langVs))
for _, schedule := range langVs {
for _, pkTeam := range schedule.PkTeams {
var teams = make([]*pb.LangRes_Team, 0, len(pkTeam.Teams))
for _, team := range pkTeam.Teams {
teams = append(teams, &pb.LangRes_Team{
Id: team.Id,
Name: team.Name,
LogoImg: team.LogoImg,
})
}
langScheduleMap[pkTeam.Id] = &pb.LangRes_PkTeam{
Id: pkTeam.Id,
Teams: teams,
VsImg: pkTeam.VsImg,
Desc: pkTeam.Desc,
}
}
}
m := s.GetDao().FissionCampaignVsTeam
vsTeam, err1 := m.WithContext(s.ctx).Where(m.CampaignID.Eq(cpn.ID)).Find()
if err1 != nil {
err1 = s.BE().MysqlError(err1)
return
}
var vsTeamMap = make(map[int64]*pb.LangRes_Team, len(vsTeam))
for _, v := range vsTeam {
vsTeamMap[v.ID] = &pb.LangRes_Team{
Id: v.ID,
Name: v.Name,
LogoImg: v.LogoImg,
}
}
scheduleM := s.GetDao().FissionCampaignVsSchedule
var list []*model.FissionCampaignVsSchedule
list, err = scheduleM.WithContext(s.ctx).Where(scheduleM.CampaignID.Eq(cpn.ID)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var vsSchedule = make(map[int32][]*model.FissionCampaignVsSchedule)
for _, v := range list {
vsSchedule[v.VsIdx] = append(vsSchedule[v.VsIdx], v)
}
res.Schedules = make([]*pb.LangRes_Schedule, len(vsSchedule))
for idx, schedules := range vsSchedule {
one := &pb.LangRes_Schedule{
Id: idx,
PkTeams: make([]*pb.LangRes_PkTeam, 0, len(schedules)),
}
for _, schedule := range schedules {
two := &pb.LangRes_PkTeam{
Id: schedule.ID,
Desc: schedule.Desc,
VsImg: schedule.VsImg,
}
for _, teamId := range schedule.GetVsTeamIds() {
if teamId > 0 {
two.Teams = append(two.Teams, vsTeamMap[teamId])
} else {
two.Teams = append(two.Teams, &pb.LangRes_Team{
Id: teamId,
})
}
}
if scd, ok := langScheduleMap[schedule.ID]; ok {
two.Desc = scd.Desc
two.VsImg = scd.VsImg
for i, team := range scd.Teams {
if team.Id > 0 {
two.Teams[i] = team
}
}
}
one.PkTeams = append(one.PkTeams, two)
}
res.Schedules[idx] = one
}
}
_ = jsonm.StrUnmarshal(lang.TalkText, &res.TalkText)
_ = jsonm.StrUnmarshal(lang.Uno, &res.Uno)
return
}
// SaveLang 保存活动多语言配置信息
func (s *WCampaign) SaveLang(req *pb.SaveLangReq, res *pb.SaveLangRes) (err error) {
defer s.checkErr()
*res = pb.SaveLangRes{}
container := new(containers.SaveLang)
{
container.Init(s.ctx, logic.WithTran(), logic.WithOnce(ckey.FissionCampaignLangSaveOnce(req.GetCampaignHashId(), req.GetLangMark())))
container.Req = req
container.Res = res
}
return container.Run()
}
// DestroyLang 删除活动语言配置信息
func (s *WCampaign) DestroyLang(req *pb.DestroyLangReq, res *pb.DestroyLangRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignLang
lang, err := m.WithContext(s.ctx).Where(m.HashID.Eq(req.GetHashId()), m.IsDel.Eq(mtype.No)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if lang == nil || lang.IsDel == mtype.Yes {
return
}
cpn, err := finder.Campaign(s.ctx, lang.CampaignID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found cpn")
return
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(lang.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
if err != nil {
err = s.BE().MysqlError(err)
return
}
lt := mtype.MarkToLangType[lang.LangMark]
var nlt []int8
for _, v := range cpn.GetLangTypes() {
if v == lt {
continue
}
nlt = append(nlt, v)
}
nltStr, _ := jsonm.MarshalToString(nlt)
cpnM := s.GetDao().FissionCampaign
_, err = cpnM.WithContext(s.ctx).Where(cpnM.ID.Eq(cpn.ID)).UpdateSimple(cpnM.LangTypes.Value(nltStr))
if err != nil {
err = s.BE().MysqlError(err)
return
}
_ = cache.NewCampaignLang(s.ctx).Clear(lang)
_ = cache.NewCampaign(s.ctx).Clear(cpn)
*res = pb.DestroyLangRes{}
return
}
// LangSelect 活动语言选择
func (s *WCampaign) LangSelect(req *pb.LangSelectReq, res *pb.LangSelectRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found cpn")
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
}
var langMap = make(map[string]bool)
for _, lang := range langs {
langMap[lang.LangMark] = true
}
*res = pb.LangSelectRes{
List: make([]*pb.LangSelectRes_One, len(mtype.MarkToLangType)),
}
for k, v := range mtype.MarkToLangType {
res.List[int(v)-1] = &pb.LangSelectRes_One{
LangType: int32(v),
LangMark: k,
Selected: langMap[k],
}
}
return
}
// CampaignInfo 活动信息
func (s *WCampaign) CampaignInfo(req *pb.CampaignInfoReq, res *pb.CampaignInfoRes) (err error) {
defer s.checkErr()
cpn, err := finder.Campaign(s.ctx, req.GetCampaignHashId(), req.GetCampaignId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.IsDel == mtype.Yes {
err = workerr.NotFound("not found campaign")
return
}
project, err := s.ProjectErrNil(cpn.ProjectID)
if err != nil {
return
}
// 默认渠道
cl, err := cmm.NewCMM(s.ctx, s.GetDao()).UserBindChannel(cpn.ID, "")
if err != nil {
return
}
var clMark string
if cl != nil {
clMark = cl.Mark
}
linkObj := blink.NewCampaignLink(project.Domain, cpn.HashID, clMark)
var pageTitle, shareImg, pcBg string
switch cpn.Target {
case mtype.FissionCampaignConfigTargetApp, mtype.FissionCampaignConfigTargetUp, mtype.FissionCampaignConfigTargetRetain:
langMark := utils.NotExistGetFirst(req.GetLang(), cpn.GetLangMarks())
if langMark == cpn.GetLangMarks()[0] {
var style *model.FissionCampaignStyle
style, err = cache.NewCampaignStyle(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
pageTitle = style.PageTitle
shareImg = style.ShareImg
pcBg = style.PcBg
} else {
var lang *model.FissionCampaignLang
lang, err = cache.NewCampaignLang(s.ctx).FindByCampaignId(cpn.ID, langMark)
if err != nil {
err = s.BE().CacheError(err)
return
}
pageTitle = lang.PageTitle
shareImg = lang.ShareImg
pcBg = lang.PcBg
}
default:
var conf *model.FissionCampaignConfig
conf, err = cache.NewCampaignConfig(s.ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
pageTitle = conf.PageTitle
shareImg = conf.ShareImg
pcBg = conf.PcBg
}
*res = pb.CampaignInfoRes{
Id: cpn.ID,
HashId: cpn.HashID,
Title: cpn.Title,
PageTitle: pageTitle,
FissionMark: consts.FissionIdMap[cpn.FissionID],
FissionTitle: consts.FissionTitle[consts.LangZhCn][consts.FissionIdMap[cpn.FissionID]],
StartTime: cpn.TStart,
EndTime: cpn.TEnd,
Status: int32(cpn.Status),
TOffset: cpn.TOffset,
LangTypes: cpn.GetLangMarks(),
ShareImg: shareImg,
Link: linkObj.CampaignShareLink(),
ImgHost: config.Config.Upload.Host,
PcBg: pcBg,
Target: int32(cpn.Target),
StartAt: cpn.StartTime,
EndAt: cpn.EndTime,
ProjectId: cpn.ProjectID,
}
return
}
// ShowReward 显示的奖品数据
func (s *WCampaign) ShowReward(req *pb.ShowRewardReq, res *pb.ShowRewardRes) (err error) {
defer s.checkErr()
*res = pb.ShowRewardRes{}
container := new(containers.ShowReward)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// AdsStore 创建Ads活动
func (s *WCampaign) AdsStore(req *pb.AdsStoreReq, res *pb.AdsStoreRes) (err error) {
defer s.checkErr()
*res = pb.AdsStoreRes{}
container := new(containers.AdsStore)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// AdsUpdate 更新Ads活动
func (s *WCampaign) AdsUpdate(req *pb.AdsUpdateReq, res *pb.AdsUpdateRes) (err error) {
defer s.checkErr()
*res = pb.AdsUpdateRes{}
container := new(containers.AdsUpdate)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// AdsShow Ads活动详情
func (s *WCampaign) AdsShow(req *pb.AdsShowReq, res *pb.AdsShowRes) (err error) {
defer s.checkErr()
*res = pb.AdsShowRes{}
container := new(containers.AdsShow)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// CampaignSelect 活动选择列表
func (s *WCampaign) CampaignSelect(req *pb.CampaignSelectReq, res *pb.CampaignSelectRes) (err error) {
defer s.checkErr()
project, err := finder.Project(s.ctx, req.GetProjectId(), req.GetProjectHashId())
if err != nil {
return s.BE().CacheError(err)
}
if project == nil || project.IsDel == mtype.Yes {
return
}
m := s.GetDao().FissionCampaign
var cond = []gen.Condition{
m.IsDel.Eq(mtype.No),
m.ProjectID.Eq(project.ID),
}
if len(req.GetTargets()) > 0 {
var targets = make([]int8, 0, len(req.GetTargets()))
for _, v := range req.GetTargets() {
targets = append(targets, int8(v))
}
cond = append(cond, m.Target.In(targets...))
}
if len(req.GetStatus()) > 0 {
var status = make([]int8, 0, len(req.GetStatus()))
for _, v := range req.GetStatus() {
status = append(status, int8(v))
}
cond = append(cond, m.Status.In(status...))
}
if req.GetTempHashId() != "" {
var temp *model.FissionTemp
tempM := s.GetDao().FissionTemp
temp, err = tempM.WithContext(s.ctx).Where(tempM.HashID.Eq(req.GetTempHashId())).Take()
if err = dbcheck.DbError(err); err != nil {
return s.BE().MysqlError(err)
}
if temp == nil {
cond = append(cond, m.FissionID.Eq(0))
} else {
cond = append(cond, m.FissionID.Eq(temp.FissionID))
}
}
if req.GetChildType() > 0 {
cond = append(cond, m.ChildType.Eq(int8(req.GetChildType())))
}
if req.GetChild() {
cond = append(cond, m.Target.Eq(mtype.FissionCampaignConfigTargetChild))
if req.GetChildWith() != "" {
var cpn *model.FissionCampaign
cpn, err = finder.Campaign(s.ctx, req.GetChildWith())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn != nil {
cond = append(cond, m.WithContext(s.ctx).Where(m.Pid.Eq(cpn.ID)).Or(m.Pid.Eq(0)))
} else {
cond = append(cond, m.Pid.Eq(-1))
}
} else {
cond = append(cond, m.Pid.Eq(0))
}
}
list, err := m.WithContext(s.ctx).Where(cond...).Order(m.ID.Desc()).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.CampaignSelectRes{
List: make([]*pb.CampaignSelectRes_One, 0, len(list)),
}
for _, v := range list {
res.List = append(res.List, &pb.CampaignSelectRes_One{
Id: v.ID,
HashId: v.HashID,
Title: v.Title,
Status: int32(v.Status),
ChildType: int32(v.ChildType),
})
}
return
}
// RewardDetail 奖品详情
func (s *WCampaign) RewardDetail(req *pb.RewardDetailReq, res *pb.RewardDetailRes) (err error) {
defer s.checkErr()
*res = pb.RewardDetailRes{}
container := new(containers.RewardDetail)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// UpdateStock 修改奖品库存
func (s *WCampaign) UpdateStock(req *pb.UpdateStockReq, res *pb.UpdateStockRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignReward
reward, err := m.WithContext(s.ctx).Where(m.ID.Eq(req.GetId())).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if reward == nil {
err = workerr.NotFound("reward not found")
return
}
cpn, err := cache.NewCampaign(s.ctx).FindById(reward.CampaignID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if !cpn.IsPub() {
err = workerr.VerifyError("campaign not run")
return
}
if reward.Stock == req.GetStock() {
return
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(reward.ID)).UpdateSimple(m.Stock.Value(req.GetStock()))
if err != nil {
err = s.BE().MysqlError(err)
return
}
_ = app.Redis.Del(s.ctx, ckey.FissionCampaignRewardPool(reward.ID))
operatelog.NewOperateLog(s.ctx).User(req.GetUserId(), req.GetIp()).UpdateRunningStock(reward.ID, reward.Stock, req.GetStock())
*res = pb.UpdateStockRes{}
return
}
// CampaignTz 活动时区数据
func (s *WCampaign) CampaignTz(req *pb.CampaignTzReq, res *pb.CampaignTzRes) (err error) {
defer s.checkErr()
cpn, err := cache.NewCampaign(s.ctx).FindById(req.GetId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("cpn not found")
return
}
if cpn.ChildType != 0 {
if cpn.Pid == 0 {
return
}
cpn, err = cache.NewCampaign(s.ctx).FindById(cpn.Pid)
if err != nil {
err = s.BE().CacheError(err)
return
}
}
*res = pb.CampaignTzRes{
List: []*pb.CampaignTzRes_One{
{
Mark: cpn.GetLangMarks()[0],
TOffset: cpn.TOffset,
},
},
}
if len(cpn.GetLangTypes()) == 1 {
return
}
m := s.GetDao().FissionCampaignLang
list, 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
}
for _, v := range list {
res.List = append(res.List, &pb.CampaignTzRes_One{
Mark: v.LangMark,
TOffset: v.TOffset,
})
}
return
}
// CampaignRewardType 活动奖品类型
func (s *WCampaign) CampaignRewardType(req *pb.CampaignRewardTypeReq, res *pb.CampaignRewardTypeRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignReward
list, err := m.WithContext(s.ctx).Where(m.CampaignID.Eq(req.GetId())).Find()
if err != nil {
return s.BE().MysqlError(err)
}
*res = pb.CampaignRewardTypeRes{
List: make([]*pb.CampaignRewardTypeRes_One, 0, len(list)),
}
for _, v := range list {
res.List = append(res.List, &pb.CampaignRewardTypeRes_One{
Id: v.ID,
RewardType: int32(v.RewardType),
})
}
return
}
// ChildList 子活动列表
func (s *WCampaign) ChildList(req *pb.ChildListReq, res *pb.ChildListRes) (err error) {
defer s.checkErr()
project, err := finder.Project(s.ctx, req.GetProjectId(), req.GetProjectHashId())
if err != nil {
return s.BE().CacheError(err)
}
if project == nil || project.IsDel == mtype.Yes {
return
}
m := s.GetDao().FissionCampaign
var cond = []gen.Condition{
m.IsDel.Eq(mtype.No),
m.ProjectID.Eq(project.ID),
m.Target.Eq(mtype.FissionCampaignConfigTargetChild),
}
if req.GetTitle() != "" {
cond = append(cond, m.Title.Like(utils.DbAllLike(req.GetTitle())))
}
if len(req.GetPids()) > 0 {
cond = append(cond, m.Pid.In(req.GetPids()...))
}
if len(req.GetStatus()) != 0 {
var status = make([]int8, 0, len(req.GetStatus()))
for _, v := range req.GetStatus() {
status = append(status, int8(v))
}
cond = append(cond, m.Status.In(status...))
}
if len(req.GetChildType()) != 0 {
var status = make([]int8, 0, len(req.GetChildType()))
for _, v := range req.GetChildType() {
status = append(status, int8(v))
}
cond = append(cond, m.ChildType.In(status...))
}
if len(req.GetFissionId()) != 0 {
cond = append(cond, m.FissionID.In(req.GetFissionId()...))
}
if len(req.GetCampaignId()) != 0 {
cond = append(cond, m.Pid.In(req.GetCampaignId()...))
}
if req.GetStart() > 0 {
cond = append(cond, m.TStart.Gte(req.GetStart()))
}
if req.GetEnd() > 0 {
cond = append(cond, m.TEnd.Lte(req.GetEnd()))
}
offset, limit := utils.PpDbLo(req.GetPage(), req.GetPerPage())
list, total, err := m.WithContext(s.ctx).Where(cond...).Order(m.ID.Desc()).FindByPage(offset, limit)
if err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.ChildListRes{
List: make([]*pb.ChildListRes_One, 0, len(list)),
Total: total,
}
var cpnIds []int64
var cpnMap = make(map[int64]string)
for _, v := range list {
if _, ok := cpnMap[v.Pid]; !ok && v.Pid > 0 {
cpnIds = append(cpnIds, v.Pid)
cpnMap[v.Pid] = ""
}
}
if len(cpnIds) > 0 {
var cpns []*model.FissionCampaign
cpns, err = m.WithContext(s.ctx).Where(m.ID.In(cpnIds...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, cpn := range cpns {
cpnMap[cpn.ID] = cpn.Title
}
}
for _, v := range list {
one := &pb.ChildListRes_One{
Id: v.ID,
HashId: v.HashID,
Title: v.Title,
FissionId: v.FissionID,
FissionMark: consts.FissionIdMap[v.FissionID],
StartTime: v.TStart,
EndTime: v.TEnd,
Status: int32(v.Status),
ChildType: int32(v.ChildType),
BindCampaign: "",
HasReport: 0,
}
if pTitle, ok := cpnMap[v.Pid]; ok {
one.BindCampaign = pTitle
one.HasReport = 1
}
res.List = append(res.List, one)
}
return
}
// ChildStore 子活动列表
func (s *WCampaign) ChildStore(req *pb.ChildStoreReq, res *pb.ChildStoreRes) (err error) {
defer s.checkErr()
*res = pb.ChildStoreRes{}
container := new(containers.ChildStore)
{
container.Init(s.ctx, logic.WithTran(), logic.WithOl())
container.Req = req
container.Res = res
}
return container.Run()
}
// ChildUpdate 更新子活动
func (s *WCampaign) ChildUpdate(req *pb.ChildUpdateReq, res *pb.ChildUpdateRes) (err error) {
defer s.checkErr()
*res = pb.ChildUpdateRes{}
container := new(containers.ChildUpdate)
{
container.Init(s.ctx, logic.WithTran(), logic.WithOl())
container.Req = req
container.Res = res
}
return container.Run()
}
// ChildShow 子活动活动
func (s *WCampaign) ChildShow(req *pb.ChildShowReq, res *pb.ChildShowRes) (err error) {
defer s.checkErr()
*res = pb.ChildShowRes{}
container := new(containers.ChildShow)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// TaskCenterJump 子活动列表
func (s *WCampaign) TaskCenterJump(req *pb.TaskCenterJumpReq, res *pb.TaskCenterJumpRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaign
list, err := m.WithContext(s.ctx).Where(m.ID.In(req.GetCpnIds()...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(list) == 0 {
return
}
projectId := list[0].ProjectID
project, err := cache.NewProject(s.ctx).FindById(projectId)
if err != nil {
err = s.BE().CacheError(err)
return
}
channelM := s.GetDao().FissionCampaignChannel
channels, err := channelM.WithContext(s.ctx).Where(
channelM.CampaignID.In(req.GetCpnIds()...),
channelM.CType.Eq(mtype.FissionCampaignChannelTypeApp),
channelM.IsDefault.Eq(mtype.Yes),
channelM.IsDel.Eq(mtype.No),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var channelMark = make(map[int64]string, len(channels))
for _, v := range channels {
channelMark[v.CampaignID] = v.Mark
}
*res = pb.TaskCenterJumpRes{
List: make([]*pb.TaskCenterJumpRes_One, 0, len(list)),
}
for _, v := range list {
res.List = append(res.List, &pb.TaskCenterJumpRes_One{
Id: v.ID,
JumpUrl: blink.NewCampaignLink(
project.Domain,
v.HashID,
channelMark[v.ID],
blink.SetTaskCenter(req.GetCenterHashId(), req.GetModuleId()),
).CampaignShareLink(),
})
}
return
}
// CondList 活动任务数据
func (s *WCampaign) CondList(req *pb.CondListReq, res *pb.CondListRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignCond
list, err := m.WithContext(s.ctx).Where(m.ID.In(req.GetIds()...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.CondListRes{
List: make([]*pb.CondListRes_One, 0, len(list)),
}
for _, v := range list {
res.List = append(res.List, &pb.CondListRes_One{
Id: v.ID,
Desc: v.Desc,
Event: v.Event,
Conds: []*pb.CondListRes_Cond{
{
EventKey: v.EventKey,
EventVal: v.EventVal,
IfCond: int32(v.IfCond),
},
},
})
}
return
}
// Campaigns 获取活动数据
func (s *WCampaign) Campaigns(req *pb.CampaignsReq, res *pb.CampaignsRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaign
list, err := m.WithContext(s.ctx).Where(m.ID.In(req.GetCampaignIds()...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.CampaignsRes{
List: make([]*pb.CampaignsRes_One, 0, len(list)),
}
for _, v := range list {
res.List = append(res.List, &pb.CampaignsRes_One{
Id: v.ID,
Title: v.Title,
})
}
return
}
// SetLvApi 设置动态用户等级动态api
func (s *WCampaign) SetLvApi(req *pb.SetLvApiReq, res *pb.SetLvApiRes) (err error) {
defer s.checkErr()
project, err := finder.Project(s.ctx, req.GetProjectHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if project == nil || project.IsDel == mtype.Yes {
err = workerr.NotFound("not found project")
return
}
conf, err := provider.NewFissionConfig(s.ctx, project)
if err != nil {
return
}
err = conf.SetLvUrl(req.GetUrlId())
if err != nil {
return
}
*res = pb.SetLvApiRes{}
return
}
// GetLvApi 获取动态用户等级动态api
func (s *WCampaign) GetLvApi(req *pb.GetLvApiReq, res *pb.GetLvApiRes) (err error) {
defer s.checkErr()
project, err := finder.Project(s.ctx, req.GetProjectHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if project == nil || project.IsDel == mtype.Yes {
err = workerr.NotFound("not found project")
return
}
conf, err := provider.NewFissionConfig(s.ctx, project)
if err != nil {
return
}
url, err := conf.GetLvUrl()
if err != nil || url == nil {
return
}
*res = pb.GetLvApiRes{
UrlId: url.ID,
Title: url.Title,
}
return
}
// VsSettlement 赛事竞猜结算
func (s *WCampaign) VsSettlement(req *pb.VsSettlementReq, res *pb.VsSettlementRes) (err error) {
defer s.checkErr()
*res = pb.VsSettlementRes{}
container := new(containers.VsSettlement)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// VsSettlementInfo 赛事竞猜结算
func (s *WCampaign) VsSettlementInfo(req *pb.VsSettlementInfoReq, res *pb.VsSettlementInfoRes) (err error) {
defer s.checkErr()
m := s.GetDao().FissionCampaignVsSchedule
schedule, err := m.WithContext(s.ctx).Where(m.ID.Eq(req.GetScheduleId())).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if schedule == nil {
err = workerr.NotFound("not found schedule")
return
}
slt := schedule.GetSettlement()
var scoreMap = make(map[int64]string, len(slt.Scores))
for _, v := range slt.Scores {
scoreMap[v.TeamId] = v.Score
}
var vsTeamIds = schedule.GetVsTeamIds()
teamM := s.GetDao().FissionCampaignVsTeam
teams, err := teamM.WithContext(s.ctx).Where(teamM.ID.In(vsTeamIds...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var teamMap = make(map[int64]*pb.VsSettlementInfoRes_Team, len(teams))
for _, v := range teams {
teamMap[v.ID] = &pb.VsSettlementInfoRes_Team{
Id: v.ID,
Name: v.Name,
LogoImg: v.LogoImg,
Score: scoreMap[v.ID],
}
}
*res = pb.VsSettlementInfoRes{
WinType: slt.WinType,
WinTeamId: slt.WinTeamId,
Teams: make([]*pb.VsSettlementInfoRes_Team, 0, len(vsTeamIds)),
}
for _, id := range vsTeamIds {
if _, ok := teamMap[id]; ok {
res.Teams = append(res.Teams, teamMap[id])
} else {
res.Teams = append(res.Teams, &pb.VsSettlementInfoRes_Team{
Id: id,
Score: scoreMap[id],
})
}
}
return
}
// ActionList 行为列表
func (s *WCampaign) ActionList(req *pb.ActionListReq, res *pb.ActionListRes) (err error) {
defer s.checkErr()
cpn, err := cache.NewCampaign(s.ctx).FindById(req.GetCampaignId())
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
}
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)
*res = pb.ActionListRes{
ActionTypes: pfa.GetFissionAction(),
}
return
}