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.

515 lines
15 KiB
Go

package campaign
import (
"joybuywork/internal/consts"
"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/repository/withdefault"
"joybuywork/internal/utils/blink"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign"
"joybuywork/proto/go_proto/workerr"
"gorm.io/gen/field"
)
type SaveLang struct {
logic.Logic
Req *pb.SaveLangReq
Res *pb.SaveLangRes
}
func (s *SaveLang) Run() error {
return logic.Run(s)
}
func (s *SaveLang) Exec() (err error) {
cpn, conf, err := s.campaign()
if err != nil {
return
}
return s.save(cpn, conf)
}
// 活动数据
func (s *SaveLang) campaign() (cpn *model.FissionCampaign, conf *model.FissionCampaignConfig, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.IsDel == mtype.Yes {
err = workerr.NotFound("cpn not found")
return
}
conf, err = cache.NewCampaignConfig(s.Ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
return
}
func (s *SaveLang) save(cpn *model.FissionCampaign, conf *model.FissionCampaignConfig) (err error) {
m := s.GetDao().FissionCampaignLang
lang, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.LangMark.Eq(s.Req.GetLangMark()), m.IsDel.Eq(mtype.No)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if s.Req.ToView {
channelM := s.GetDao().FissionCampaignChannel
var channel *model.FissionCampaignChannel
channel, err = channelM.WithContext(s.Ctx).Where(channelM.CampaignID.Eq(cpn.ID), channelM.IsDefault.Eq(mtype.Yes), channelM.IsDel.Eq(mtype.No)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
var project *model.Project
project, err = cache.NewProject(s.Ctx).FindById(cpn.ProjectID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if channel != nil {
linkObj := blink.NewCampaignLink(project.Domain, cpn.HashID, channel.Mark,
blink.SetView(),
blink.SetLang(s.Req.GetLangMark()),
blink.SetUserId(consts.FissionViewer),
)
s.Res.ViewLink = linkObj.CampaignShareLink()
}
}
if lang == nil {
return s._create(cpn, conf)
}
return s._update(lang, conf)
}
func (s *SaveLang) _create(cpn *model.FissionCampaign, conf *model.FissionCampaignConfig) (err error) {
langTypes := cpn.GetLangTypes()
nt := mtype.MarkToLangType[s.Req.GetLangMark()]
for _, v := range langTypes {
if v == nt {
err = s.BE().VerifyError("lang exist")
return
}
}
conds, _ := jsonm.ToSliceString(s.Req.GetConds())
quit, _ := jsonm.ToObjString(s.Req.GetQuit())
questions, _ := jsonm.ToSliceString(s.Req.GetQuestions())
cash, _ := jsonm.ToObjString(s.Req.GetCash())
gold, _ := jsonm.ToObjString(s.Req.GetGold())
coin, _ := jsonm.ToObjString(s.Req.GetCoin())
qaGroup, _ := jsonm.ToObjString(s.Req.GetQaGroup())
talkText, _ := jsonm.ToSliceString(s.Req.GetTalkText())
vs, _ := jsonm.ToSliceString(s.Req.GetSchedules())
lang := withdefault.FissionCampaignLang(&model.FissionCampaignLang{
CampaignID: cpn.ID,
LangMark: s.Req.GetLangMark(),
PageTitle: s.Req.GetPageTitle(),
ImageMain: s.Req.GetImageMain(),
DownloadPageImage: s.Req.GetDownloadPageImage(),
WechatPageImage: s.Req.GetWechatPageImage(),
ContentImg: s.Req.GetContentImg(),
WebBgImg: s.Req.GetWebBgImg(),
WarmUpImg: s.Req.GetWarmUpImg(),
DlBgImg: s.Req.GetDlBgImg(),
DlBannerImg: s.Req.GetDlBannerImg(),
DlBannerAppLogo: s.Req.GetDlBannerAppLogo(),
DlBannerAppName: s.Req.GetDlBannerAppName(),
DlBannerAppBtn: s.Req.GetDlBannerAppBtn(),
ShareText: s.Req.GetShareText(),
ShareImg: s.Req.GetShareImg(),
Rule: s.Req.GetRule(),
Conds: conds,
Quit: quit,
Questions: questions,
QaGroup: qaGroup,
LongImg: "[]",
Cash: cash,
Gold: gold,
TOffset: s.Req.GetTOffset(),
TalkText: talkText,
Coin: coin,
TopicColor: s.Req.GetTopicColor(),
PcBg: s.Req.GetPcBg(),
RuleImg: s.Req.GetRuleImg(),
Vs: vs,
Uno: "{}",
})
if uno := s.Req.GetUno(); uno != nil {
lang.SetUno(&mtype.LangUno{
Red: s._unoCard(uno.GetRed()),
Blue: s._unoCard(uno.GetBlue()),
Green: s._unoCard(uno.GetGreen()),
Yellow: s._unoCard(uno.GetYellow()),
})
}
err = s.GetDao().FissionCampaignLang.WithContext(s.Ctx).Create(lang)
if err != nil {
err = s.BE().MysqlError(err)
return
}
if conf.HasLongImg == mtype.Yes {
var zones []*model.FissionCampaignLongImgZone
var imgs = make([]*model.FissionCampaignLongImg, 0, len(s.Req.GetLongImgs()))
for _, v := range s.Req.GetLongImgs() {
one := withdefault.FissionCampaignLongImg(&model.FissionCampaignLongImg{
CampaignID: cpn.ID,
LangID: lang.ID,
ClickType: int8(v.ClickType),
ImgURL: v.ImgUrl,
WebURL: v.WebUrl,
AppParam: v.AppParam,
PcParam: v.PcParam,
TargetType: int8(v.GetTargetType()),
TargetID: v.GetTargetId(),
LangSourceID: v.GetLangSourceId(),
})
for _, zone := range v.GetHotZone() {
zones = append(zones, withdefault.FissionCampaignLongImgZone(&model.FissionCampaignLongImgZone{
CampaignID: cpn.ID,
ImgID: one.ID,
WebURL: zone.WebUrl,
AppParam: zone.AppParam,
ClickX: zone.ClickX,
ClickY: zone.ClickY,
ClickH: zone.ClickH,
ClickW: zone.ClickW,
TargetType: int8(zone.GetTargetType()),
TargetID: zone.GetTargetId(),
PcParam: zone.GetPcParam(),
}))
}
imgs = append(imgs, one)
}
err = s.GetDao().FissionCampaignLongImg.WithContext(s.Ctx).Create(imgs...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(zones) > 0 {
err = s.GetDao().FissionCampaignLongImgZone.WithContext(s.Ctx).Create(zones...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
}
langTypes = append(langTypes, nt)
m := s.GetDao().FissionCampaign
lt, _ := jsonm.MarshalToString(langTypes)
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(cpn.ID)).UpdateSimple(m.LangTypes.Value(lt))
if err != nil {
err = s.BE().MysqlError(err)
return
}
s.AddAfterRun(func() (err error) {
return cache.NewCampaign(s.Ctx).Clear(cpn)
})
return
}
func (s *SaveLang) _unoCard(in []*pb.SaveLangReq_UnoCard) []*mtype.UnoCard {
out := make([]*mtype.UnoCard, 0, len(in))
for i, v := range in {
out = append(out, &mtype.UnoCard{
CardNo: int32(i) + 1,
Title: v.GetTitle(),
ImgURL: v.GetImgUrl(),
WebURL: v.GetWebUrl(),
AppParam: v.GetAppParam(),
PcParam: v.GetPcParam(),
})
}
return out
}
func (s *SaveLang) _update(lang *model.FissionCampaignLang, conf *model.FissionCampaignConfig) (err error) {
conds, _ := jsonm.ToSliceString(s.Req.GetConds())
quit, _ := jsonm.ToObjString(s.Req.GetQuit())
questions, _ := jsonm.ToSliceString(s.Req.GetQuestions())
cash, _ := jsonm.ToObjString(s.Req.GetCash())
gold, _ := jsonm.ToObjString(s.Req.GetGold())
coin, _ := jsonm.ToObjString(s.Req.GetCoin())
qaGroup, _ := jsonm.ToObjString(s.Req.GetQaGroup())
talkText, _ := jsonm.ToSliceString(s.Req.GetTalkText())
vs, _ := jsonm.ToSliceString(s.Req.GetSchedules())
m := s.GetDao().FissionCampaignLang
var upData = []field.AssignExpr{
m.PageTitle.Value(s.Req.GetPageTitle()),
m.ImageMain.Value(s.Req.GetImageMain()),
m.DownloadPageImage.Value(s.Req.GetDownloadPageImage()),
m.WechatPageImage.Value(s.Req.GetWechatPageImage()),
m.WebBgImg.Value(s.Req.GetWebBgImg()),
m.WarmUpImg.Value(s.Req.GetWarmUpImg()),
m.ContentImg.Value(s.Req.GetContentImg()),
m.DlBgImg.Value(s.Req.GetDlBgImg()),
m.DlBannerImg.Value(s.Req.GetDlBannerImg()),
m.DlBannerAppLogo.Value(s.Req.GetDlBannerAppLogo()),
m.DlBannerAppName.Value(s.Req.GetDlBannerAppName()),
m.DlBannerAppBtn.Value(s.Req.GetDlBannerAppBtn()),
m.ShareText.Value(s.Req.GetShareText()),
m.ShareImg.Value(s.Req.GetShareImg()),
m.Rule.Value(s.Req.GetRule()),
m.Cash.Value(cash),
m.Gold.Value(gold),
m.Coin.Value(coin),
m.TOffset.Value(s.Req.GetTOffset()),
m.TopicColor.Value(s.Req.GetTopicColor()),
m.PcBg.Value(s.Req.GetPcBg()),
m.RuleImg.Value(s.Req.GetRuleImg()),
m.Vs.Value(vs),
}
if uno := s.Req.GetUno(); uno != nil {
unoVal, _ := jsonm.ToObjString(&mtype.LangUno{
Red: s._unoCard(uno.GetRed()),
Blue: s._unoCard(uno.GetBlue()),
Green: s._unoCard(uno.GetGreen()),
Yellow: s._unoCard(uno.GetYellow()),
})
upData = append(upData, m.Uno.Value(unoVal))
}
upData = append(upData, m.Conds.Value(conds), m.Questions.Value(questions), m.Quit.Value(quit), m.QaGroup.Value(qaGroup), m.TalkText.Value(talkText))
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(lang.ID)).UpdateSimple(upData...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
s.AddAfterRun(func() (err error) {
return cache.NewCampaignLang(s.Ctx).Clear(lang)
})
if conf.HasLongImg == mtype.No {
return
}
imgM := s.GetDao().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 oldMap = make(map[int64]*model.FissionCampaignLongImg)
for _, v := range imgs {
oldMap[v.ID] = v
}
zoneM := s.GetDao().FissionCampaignLongImgZone
var zone []*model.FissionCampaignLongImgZone
var add = make([]*model.FissionCampaignLongImg, 0)
var zoneDelIds []int64
for _, v := range s.Req.GetLongImgs() {
old, ok := oldMap[v.GetId()]
if !ok {
one := withdefault.FissionCampaignLongImg(&model.FissionCampaignLongImg{
CampaignID: conf.CampaignID,
LangID: lang.ID,
ClickType: int8(v.GetClickType()),
ImgURL: v.GetImgUrl(),
WebURL: v.GetWebUrl(),
AppParam: v.GetAppParam(),
TargetType: int8(v.GetTargetType()),
TargetID: v.GetTargetId(),
PcParam: v.GetPcParam(),
})
if v.GetClickType() == mtype.FissionCampaignLongImgClickTypeZone {
for _, hotZone := range v.GetHotZone() {
zone = append(zone, withdefault.FissionCampaignLongImgZone(&model.FissionCampaignLongImgZone{
CampaignID: conf.CampaignID,
ImgID: one.ID,
WebURL: hotZone.GetWebUrl(),
AppParam: hotZone.GetAppParam(),
ClickX: hotZone.GetClickX(),
ClickY: hotZone.GetClickY(),
ClickH: hotZone.GetClickH(),
ClickW: hotZone.GetClickW(),
TargetType: int8(hotZone.GetTargetType()),
TargetID: hotZone.GetTargetId(),
PcParam: hotZone.GetPcParam(),
}))
}
}
add = append(add, one)
continue
}
_, err = imgM.WithContext(s.Ctx).Where(imgM.ID.Eq(old.ID)).UpdateSimple(
imgM.ClickType.Value(int8(v.GetClickType())),
imgM.ImgURL.Value(v.GetImgUrl()),
imgM.WebURL.Value(v.GetWebUrl()),
imgM.AppParam.Value(v.GetAppParam()),
imgM.TargetType.Value(int8(v.GetTargetType())),
imgM.TargetID.Value(v.GetTargetId()),
imgM.PcParam.Value(v.GetPcParam()),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
delete(oldMap, old.ID)
switch old.ClickType {
case mtype.FissionCampaignLongImgClickTypeAll:
if v.GetClickType() == mtype.FissionCampaignLongImgClickTypeZone {
for _, hotZone := range v.GetHotZone() {
zone = append(zone, withdefault.FissionCampaignLongImgZone(&model.FissionCampaignLongImgZone{
CampaignID: conf.CampaignID,
ImgID: old.ID,
WebURL: hotZone.GetWebUrl(),
AppParam: hotZone.GetAppParam(),
ClickX: hotZone.GetClickX(),
ClickY: hotZone.GetClickY(),
ClickH: hotZone.GetClickH(),
ClickW: hotZone.GetClickW(),
TargetType: int8(hotZone.GetTargetType()),
TargetID: hotZone.GetTargetId(),
PcParam: hotZone.GetPcParam(),
}))
}
}
case mtype.FissionCampaignLongImgClickTypeZone:
if v.GetClickType() == mtype.FissionCampaignLongImgClickTypeAll {
_, err = zoneM.WithContext(s.Ctx).Where(zoneM.ImgID.Eq(old.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
if err != nil {
err = s.BE().MysqlError(err)
return
}
} else if v.GetClickType() == mtype.FissionCampaignLongImgClickTypeZone {
var zones []*model.FissionCampaignLongImgZone
zones, err = zoneM.WithContext(s.Ctx).Where(zoneM.ImgID.Eq(old.ID), zoneM.IsDel.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var oldZoneMap = make(map[int64]*model.FissionCampaignLongImgZone, len(zones))
for _, click := range zones {
oldZoneMap[click.ID] = click
}
for _, hotZone := range v.GetHotZone() {
oldZone, ok1 := oldZoneMap[hotZone.GetId()]
if !ok1 {
zone = append(zone, withdefault.FissionCampaignLongImgZone(&model.FissionCampaignLongImgZone{
CampaignID: conf.CampaignID,
ImgID: old.ID,
WebURL: hotZone.GetWebUrl(),
AppParam: hotZone.GetAppParam(),
ClickX: hotZone.GetClickX(),
ClickY: hotZone.GetClickY(),
ClickH: hotZone.GetClickH(),
ClickW: hotZone.GetClickW(),
TargetType: int8(hotZone.GetTargetType()),
TargetID: hotZone.GetTargetId(),
PcParam: hotZone.GetPcParam(),
}))
continue
}
_, err = zoneM.WithContext(s.Ctx).Where(zoneM.ID.Eq(oldZone.ID)).UpdateSimple(
zoneM.WebURL.Value(hotZone.GetWebUrl()),
zoneM.AppParam.Value(hotZone.GetAppParam()),
zoneM.ClickX.Value(hotZone.GetClickX()),
zoneM.ClickY.Value(hotZone.GetClickY()),
zoneM.ClickH.Value(hotZone.GetClickH()),
zoneM.ClickW.Value(hotZone.GetClickW()),
zoneM.TargetType.Value(int8(hotZone.GetTargetType())),
zoneM.TargetID.Value(hotZone.GetTargetId()),
zoneM.PcParam.Value(hotZone.GetPcParam()),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
delete(oldZoneMap, oldZone.ID)
}
for id := range oldZoneMap {
zoneDelIds = append(zoneDelIds, id)
}
}
}
}
var imgDelIds []int64
for id := range oldMap {
imgDelIds = append(imgDelIds, id)
}
if len(add) > 0 {
err = imgM.WithContext(s.Ctx).Create(add...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
if len(zone) > 0 {
err = zoneM.WithContext(s.Ctx).Create(zone...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
if len(imgDelIds) > 0 {
_, err = imgM.WithContext(s.Ctx).Where(imgM.ID.In(imgDelIds...)).UpdateSimple(imgM.IsDel.Value(mtype.Yes))
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
if len(zoneDelIds) > 0 {
_, err = zoneM.WithContext(s.Ctx).Where(zoneM.ID.In(zoneDelIds...)).UpdateSimple(zoneM.IsDel.Value(mtype.Yes))
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
return
}