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.
449 lines
11 KiB
Go
449 lines
11 KiB
Go
package service
|
|
|
|
import (
|
|
"joybuywork/internal/consts"
|
|
"joybuywork/internal/consts/ckey"
|
|
"joybuywork/internal/repository/cache"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/repository/withdefault"
|
|
"joybuywork/internal/service/containers"
|
|
"joybuywork/internal/utils"
|
|
"joybuywork/internal/utils/arr"
|
|
"joybuywork/internal/utils/logic"
|
|
"joybuywork/internal/utils/verify"
|
|
pb "joybuywork/proto/go_proto/w_fission"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
|
|
"gorm.io/gen"
|
|
)
|
|
|
|
type WFission struct {
|
|
Service
|
|
}
|
|
|
|
// List 玩法列表
|
|
func (s *WFission) List(req *pb.ListReq, res *pb.ListRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
list := consts.FissionList()
|
|
|
|
var targets []int32
|
|
if req.GetTarget() > 0 {
|
|
targets = append(targets, req.GetTarget())
|
|
}
|
|
|
|
if len(req.GetTargets()) > 0 {
|
|
for _, target := range req.GetTargets() {
|
|
if target == req.GetTarget() {
|
|
continue
|
|
}
|
|
targets = append(targets, target)
|
|
}
|
|
}
|
|
|
|
// 找全部
|
|
if len(targets) == 0 {
|
|
*res = pb.ListRes{
|
|
List: make([]*pb.ListRes_One, 0, len(list)),
|
|
}
|
|
|
|
for _, v := range list {
|
|
res.List = append(res.List, &pb.ListRes_One{
|
|
Id: v.Id,
|
|
Mark: v.Mark,
|
|
Logo: v.Logo,
|
|
Title: v.GetTitle(req.GetLang(), req.GetTarget()),
|
|
CanUse: v.CanUse,
|
|
Desc: v.GetDesc(req.GetLang(), req.GetTarget()),
|
|
Color: v.Color,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 找部分
|
|
var fissionByTarget []int64
|
|
for _, target := range targets {
|
|
fissionByTarget = arr.NotExistAppend(fissionByTarget, consts.FissionByTarget[target])
|
|
}
|
|
|
|
*res = pb.ListRes{
|
|
List: make([]*pb.ListRes_One, 0, len(fissionByTarget)),
|
|
}
|
|
|
|
for _, v := range list {
|
|
if !verify.InArray(v.Id, fissionByTarget...) {
|
|
continue
|
|
}
|
|
|
|
one := &pb.ListRes_One{
|
|
Id: v.Id,
|
|
Mark: v.Mark,
|
|
Logo: v.Logo,
|
|
Title: v.GetTitle(req.GetLang(), req.GetTarget()),
|
|
CanUse: v.CanUse,
|
|
Desc: v.GetDesc(req.GetLang(), req.GetTarget()),
|
|
Color: v.Color,
|
|
}
|
|
|
|
if req.GetTarget() == consts.FissionTargetRetain {
|
|
one.Logo = v.RetainLogo
|
|
} else if req.GetTarget() == consts.FissionTargetConvert {
|
|
one.Logo = v.ConvertLogo
|
|
}
|
|
|
|
res.List = append(res.List, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// TemplateList 玩法模版列表
|
|
func (s *WFission) TemplateList(req *pb.TemplateListReq, res *pb.TemplateListRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
fissionId, ok := consts.FissionMarkMap[req.Mark]
|
|
|
|
if !ok {
|
|
return workerr.NotFound("fission mark not found")
|
|
}
|
|
|
|
m := s.GetDao().FissionTempGroup
|
|
var cond = []gen.Condition{
|
|
m.IsDel.Eq(mtype.No),
|
|
m.FissionID.Eq(fissionId),
|
|
}
|
|
|
|
list, err := m.WithContext(s.ctx).Where(cond...).Order(m.Sort, m.ID).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.TemplateListRes{
|
|
List: make([]*pb.TemplateListRes_One, 0, len(list)),
|
|
}
|
|
|
|
var ids = make([]int64, 0, len(list))
|
|
for _, v := range list {
|
|
ids = append(ids, v.ID)
|
|
}
|
|
|
|
tempM := s.GetDao().FissionTemp
|
|
tempList, err := tempM.WithContext(s.ctx).Where(tempM.GroupID.In(ids...), tempM.IsDel.Eq(mtype.No)).Order(tempM.LangType).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
var groupTemp = make(map[int64][]*model.FissionTemp)
|
|
for _, v := range tempList {
|
|
groupTemp[v.GroupID] = append(groupTemp[v.GroupID], v)
|
|
}
|
|
|
|
for _, v := range list {
|
|
one := &pb.TemplateListRes_One{
|
|
Id: v.ID,
|
|
Mark: v.Mark,
|
|
CoverUrl: utils.Ternary(req.GetTarget() == mtype.FissionCampaignConfigTargetUp && v.ConvertCoverURL != "", v.ConvertCoverURL, v.CoverURL),
|
|
Title: "",
|
|
Sort: v.Sort,
|
|
Temps: nil,
|
|
IsPrivate: int32(v.IsPrivate),
|
|
}
|
|
|
|
if temps, ok1 := groupTemp[v.ID]; ok1 {
|
|
one.Temps = make([]*pb.TemplateListRes_Temp, 0, len(temps))
|
|
for _, v1 := range temps {
|
|
one.Temps = append(one.Temps, &pb.TemplateListRes_Temp{
|
|
HashId: v1.HashID,
|
|
LangType: int32(v1.LangType),
|
|
})
|
|
}
|
|
}
|
|
|
|
res.List = append(res.List, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// TemplateInfo 玩法模版信息
|
|
func (s *WFission) TemplateInfo(req *pb.TemplateInfoReq, res *pb.TemplateInfoRes) (err error) {
|
|
defer s.checkErr()
|
|
container := new(containers.FissionTemplateInfo)
|
|
{
|
|
container.Init(s.ctx)
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|
|
|
|
// CreateTempGroup 创建模板组
|
|
func (s *WFission) CreateTempGroup(req *pb.CreateTempGroupReq, res *pb.CreateTempGroupRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
container := new(containers.FissionCreateTempGroup)
|
|
{
|
|
container.Init(s.ctx, logic.WithTran(), logic.WithOnce(ckey.FissionTempGroupStoreOnce(req.GetMark())))
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|
|
|
|
// CreateTemp 玩法模版列表
|
|
func (s *WFission) CreateTemp(req *pb.CreateTempReq, res *pb.CreateTempRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
group, err := cache.NewFissionTempGroup(s.ctx).FindById(req.GetGroupId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if group == nil || group.IsDel == mtype.Yes {
|
|
return workerr.NotFound("temp_group not found")
|
|
}
|
|
|
|
tx := s.GetDao().Begin()
|
|
defer func() {
|
|
if err != nil {
|
|
_ = tx.Rollback()
|
|
return
|
|
}
|
|
_ = tx.Commit()
|
|
}()
|
|
|
|
m := tx.FissionTemp
|
|
temp := withdefault.FissionTemp(&model.FissionTemp{
|
|
FissionID: group.FissionID,
|
|
GroupID: group.ID,
|
|
LangType: int8(req.GetLangType()),
|
|
TextType: int8(req.GetTextType()),
|
|
})
|
|
|
|
if err = m.WithContext(s.ctx).Create(temp); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
var conf = make([]*model.FissionTempImage, 0, len(req.GetImage()))
|
|
for _, kv := range req.GetImage() {
|
|
conf = append(conf, &model.FissionTempImage{
|
|
TempID: temp.ID,
|
|
Mark: kv.Key,
|
|
Val: kv.Value,
|
|
Desc: kv.Desc,
|
|
})
|
|
}
|
|
|
|
var lang = make([]*model.FissionTempLang, 0, len(req.GetLang()))
|
|
for _, kv := range req.GetLang() {
|
|
lang = append(lang, withdefault.FissionTempLang(&model.FissionTempLang{
|
|
TempID: temp.ID,
|
|
Mark: kv.Key,
|
|
Val: kv.Value,
|
|
Desc: kv.Desc,
|
|
}))
|
|
}
|
|
|
|
if err = tx.FissionTempImage.WithContext(s.ctx).Create(conf...); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if err = tx.FissionTempLang.WithContext(s.ctx).Create(lang...); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.CreateTempRes{
|
|
Id: temp.ID,
|
|
HashId: temp.HashID,
|
|
}
|
|
return
|
|
}
|
|
|
|
// CreateTempLang 玩法模版列表
|
|
func (s *WFission) CreateTempLang(req *pb.CreateTempLangReq, res *pb.CreateTempLangRes) (err error) {
|
|
defer s.checkErr()
|
|
tempM := s.GetDao().FissionTemp
|
|
var temp *model.FissionTemp
|
|
if req.GetId() > 0 {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.ID.Eq(req.GetId())).Take()
|
|
} else if req.GetHashId() != "" {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.HashID.Eq(req.GetHashId())).Take()
|
|
}
|
|
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if temp == nil || temp.IsDel == mtype.Yes {
|
|
return workerr.NotFound("temp not found")
|
|
}
|
|
|
|
conf := make([]*model.FissionTempLang, 0, len(req.GetLang()))
|
|
for _, kv := range req.GetLang() {
|
|
conf = append(conf, withdefault.FissionTempLang(&model.FissionTempLang{
|
|
TempID: temp.ID,
|
|
Mark: kv.Key,
|
|
Val: kv.Value,
|
|
Desc: kv.Desc,
|
|
}))
|
|
}
|
|
|
|
if err = s.GetDao().FissionTempLang.WithContext(s.ctx).Create(conf...); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.CreateTempLangRes{}
|
|
return
|
|
}
|
|
|
|
// CreateTempImg 玩法模版列表
|
|
func (s *WFission) CreateTempImg(req *pb.CreateTempImgReq, res *pb.CreateTempImgRes) (err error) {
|
|
defer s.checkErr()
|
|
tempM := s.GetDao().FissionTemp
|
|
var temp *model.FissionTemp
|
|
if req.GetId() > 0 {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.ID.Eq(req.GetId())).Take()
|
|
} else if req.GetHashId() != "" {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.HashID.Eq(req.GetHashId())).Take()
|
|
}
|
|
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if temp == nil || temp.IsDel == mtype.Yes {
|
|
return workerr.NotFound("temp not found")
|
|
}
|
|
|
|
conf := make([]*model.FissionTempImage, 0, len(req.GetImage()))
|
|
for _, kv := range req.GetImage() {
|
|
conf = append(conf, withdefault.FissionTempImage(&model.FissionTempImage{
|
|
TempID: temp.ID,
|
|
Mark: kv.Key,
|
|
Val: kv.Value,
|
|
Desc: kv.Desc,
|
|
}))
|
|
}
|
|
|
|
if err = s.GetDao().FissionTempImage.WithContext(s.ctx).Create(conf...); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.CreateTempImgRes{}
|
|
return
|
|
}
|
|
|
|
// UpdateTempImg 更新玩法图片配置
|
|
func (s *WFission) UpdateTempImg(req *pb.UpdateTempImgReq, res *pb.UpdateTempImgRes) (err error) {
|
|
defer s.checkErr()
|
|
tempM := s.GetDao().FissionTemp
|
|
var temp *model.FissionTemp
|
|
if req.GetId() > 0 {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.ID.Eq(req.GetId())).Take()
|
|
} else if req.GetHashId() != "" {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.HashID.Eq(req.GetHashId())).Take()
|
|
}
|
|
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if temp == nil || temp.IsDel == mtype.Yes {
|
|
return workerr.NotFound("temp not found")
|
|
}
|
|
|
|
var marks []string
|
|
var imgMap = make(map[string]*pb.UpdateTempImgReq_KV)
|
|
|
|
for _, v := range req.GetImage() {
|
|
marks = append(marks, v.GetKey())
|
|
imgMap[v.Key] = v
|
|
}
|
|
|
|
m := s.GetDao().FissionTempImage
|
|
|
|
list, err := m.WithContext(s.ctx).Where(m.TempID.Eq(temp.ID), m.Mark.In(marks...)).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
for _, v := range list {
|
|
if img, ok := imgMap[v.Mark]; ok && (img.Value != v.Val || img.Desc != v.Desc) {
|
|
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(v.ID)).UpdateSimple(m.Val.Value(img.Value), m.Desc.Value(img.Desc))
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
}
|
|
}
|
|
*res = pb.UpdateTempImgRes{}
|
|
return
|
|
}
|
|
|
|
// UpdateTempLang 更新玩法语言配置
|
|
func (s *WFission) UpdateTempLang(req *pb.UpdateTempLangReq, res *pb.UpdateTempLangRes) (err error) {
|
|
defer s.checkErr()
|
|
tempM := s.GetDao().FissionTemp
|
|
var temp *model.FissionTemp
|
|
if req.GetId() > 0 {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.ID.Eq(req.GetId())).Take()
|
|
} else if req.GetHashId() != "" {
|
|
temp, err = tempM.WithContext(s.ctx).Where(tempM.HashID.Eq(req.GetHashId())).Take()
|
|
}
|
|
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if temp == nil || temp.IsDel == mtype.Yes {
|
|
return workerr.NotFound("temp not found")
|
|
}
|
|
|
|
var marks []string
|
|
var langMap = make(map[string]*pb.UpdateTempLangReq_KV)
|
|
|
|
for _, v := range req.GetLang() {
|
|
marks = append(marks, v.GetKey())
|
|
langMap[v.Key] = v
|
|
}
|
|
|
|
m := s.GetDao().FissionTempLang
|
|
|
|
list, err := m.WithContext(s.ctx).Where(m.TempID.Eq(temp.ID), m.Mark.In(marks...)).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
for _, v := range list {
|
|
if lang, ok := langMap[v.Mark]; ok && (lang.Value != v.Val || lang.Desc != v.Desc) {
|
|
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(v.ID)).UpdateSimple(m.Val.Value(lang.Value), m.Desc.Value(lang.Desc))
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
*res = pb.UpdateTempLangRes{}
|
|
return
|
|
}
|
|
|
|
// UpdateTempGroup 更新模板组
|
|
func (s *WFission) UpdateTempGroup(req *pb.UpdateTempGroupReq, res *pb.UpdateTempGroupRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
container := new(containers.FissionUpdateTempGroup)
|
|
{
|
|
container.Init(s.ctx, logic.WithTran())
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|