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

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
}