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.
238 lines
4.7 KiB
Go
238 lines
4.7 KiB
Go
package containers
|
|
|
|
import (
|
|
"joybuywork/internal/plugins/jsonm"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/utils"
|
|
"joybuywork/internal/utils/logic"
|
|
pb "joybuywork/proto/go_proto/w_reward"
|
|
"strings"
|
|
|
|
"gorm.io/gen"
|
|
)
|
|
|
|
type Num struct {
|
|
RewardId int64
|
|
Num int64
|
|
}
|
|
|
|
type RewardList struct {
|
|
logic.Logic
|
|
|
|
Req *pb.ListReq
|
|
Res *pb.ListRes
|
|
}
|
|
|
|
func (s *RewardList) Run() (err error) {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *RewardList) Exec() (err error) {
|
|
project, err := finder.Project(s.Ctx, s.Req.GetProjectHashId())
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if project == nil {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().Reward
|
|
|
|
var cond = []gen.Condition{
|
|
m.ProjectID.Eq(project.ID),
|
|
m.IsDel.Eq(mtype.No),
|
|
}
|
|
|
|
query := m.WithContext(s.Ctx)
|
|
|
|
if s.Req.GetRewardTitle() != "" {
|
|
cond = append(cond, m.RewardTitle.Like(utils.DbAllLike(s.Req.GetRewardTitle())))
|
|
}
|
|
|
|
if s.Req.GetLangMark() != "" || s.Req.GetTitle() != "" {
|
|
rewardM := s.GetDao().RewardLang
|
|
query = query.Join(rewardM, rewardM.RewardID.EqCol(m.ID)).Group(m.ID)
|
|
|
|
if s.Req.GetLangMark() != "" {
|
|
lms := strings.Split(s.Req.GetLangMark(), ",")
|
|
cond = append(cond, rewardM.Mark.In(lms...))
|
|
}
|
|
|
|
if s.Req.GetTitle() != "" {
|
|
cond = append(cond, rewardM.Title.Like(utils.DbAllLike(s.Req.GetTitle())))
|
|
}
|
|
}
|
|
|
|
switch s.Req.GetOrderType() {
|
|
case 1:
|
|
query = query.Order(m.CreatedAt)
|
|
default:
|
|
query = query.Order(m.ID.Desc())
|
|
}
|
|
|
|
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
|
|
list, total, err := query.Where(cond...).FindByPage(offset, limit)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
s.Res.List = make([]*pb.ListRes_One, 0, len(list))
|
|
s.Res.Total = total
|
|
|
|
if total == 0 {
|
|
return
|
|
}
|
|
|
|
var ids []int64
|
|
for _, v := range list {
|
|
ids = append(ids, v.ID)
|
|
}
|
|
|
|
relateNum, err := s._relatedNum(ids)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
titleAndImg, langMap, err := s._rewardLangs(ids)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
one := &pb.ListRes_One{
|
|
Id: v.ID,
|
|
RewardTitle: v.RewardTitle,
|
|
Title: "",
|
|
ImgUrl: "",
|
|
ReceiveType: int32(v.ReceiveType),
|
|
RelatedNum: relateNum[v.ID],
|
|
KvData: nil,
|
|
Langs: make([]*pb.ListRes_Lang, 0, len(langMap[v.ID])),
|
|
DyRewardType: int32(v.DyRewardType),
|
|
CreatedAt: v.CreatedAt,
|
|
Contact: v.Contact,
|
|
UrlId: v.URLID,
|
|
}
|
|
|
|
if info, ok := titleAndImg[v.ID]; ok {
|
|
one.Title = info.Title
|
|
one.ImgUrl = info.ImgURL
|
|
}
|
|
|
|
_ = jsonm.StrUnmarshal(v.KvData, &one.KvData)
|
|
|
|
for _, lang := range langMap[v.ID] {
|
|
one.Langs = append(one.Langs, &pb.ListRes_Lang{
|
|
Mark: lang.Mark,
|
|
Title: lang.Title,
|
|
ImgUrl: lang.ImgURL,
|
|
IsDefault: int32(lang.IsDefault),
|
|
LangType: int32(mtype.MarkToLangType[lang.Mark]),
|
|
ImgId: lang.ImageID,
|
|
})
|
|
}
|
|
|
|
s.Res.List = append(s.Res.List, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *RewardList) _relatedNum(ids []int64) (data map[int64]int64, err error) {
|
|
data = make(map[int64]int64)
|
|
|
|
m := s.GetDao().RewardRelated
|
|
|
|
var num []*Num
|
|
err = m.WithContext(s.Ctx).
|
|
Select(m.RewardID, m.ID.Count().As("num")).
|
|
Where(m.RewardID.In(ids...), m.CancelTime.Eq(0)).
|
|
Group(m.RewardID).
|
|
Scan(&num)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
for _, v := range num {
|
|
data[v.RewardId] = v.Num
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *RewardList) _rewardLangs(ids []int64) (data map[int64]*model.RewardLang, rlMap map[int64][]*model.RewardLang, err error) {
|
|
|
|
m := s.GetDao().RewardLang
|
|
list, err := m.WithContext(s.Ctx).Where(m.RewardID.In(ids...), m.IsDel.Eq(mtype.No)).Order(m.ID).Find()
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
rlMap = make(map[int64][]*model.RewardLang)
|
|
for _, v := range list {
|
|
rlMap[v.RewardID] = append(rlMap[v.RewardID], v)
|
|
}
|
|
|
|
data = make(map[int64]*model.RewardLang)
|
|
|
|
var idMap = make(map[int64]struct{})
|
|
for _, id := range ids {
|
|
idMap[id] = struct{}{}
|
|
}
|
|
|
|
// 找筛选的第一种语言
|
|
if s.Req.GetLangMark() != "" {
|
|
lm := strings.Split(s.Req.GetLangMark(), ",")[0]
|
|
for _, v := range list {
|
|
if v.Mark == lm {
|
|
data[v.RewardID] = v
|
|
if _, ok := idMap[v.RewardID]; ok {
|
|
delete(idMap, v.RewardID)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 找页面的语言
|
|
var plmIds []int64
|
|
for id := range idMap {
|
|
plmIds = append(plmIds, id)
|
|
}
|
|
|
|
if len(plmIds) == 0 {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
if v.Mark == s.Req.GetPageLang() {
|
|
data[v.RewardID] = v
|
|
if _, ok := idMap[v.RewardID]; ok {
|
|
delete(idMap, v.RewardID)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// 找默认语言
|
|
var dfIds []int64
|
|
for id := range idMap {
|
|
dfIds = append(dfIds, id)
|
|
}
|
|
|
|
if len(dfIds) == 0 {
|
|
return
|
|
}
|
|
|
|
for _, v := range list {
|
|
if _, ok := data[v.RewardID]; !ok && v.IsDefault == mtype.Yes {
|
|
data[v.RewardID] = v
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|