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.

274 lines
5.4 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package mall
import (
"joybuywork/internal/app"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_mall"
"joybuywork/proto/go_proto/workerr"
"time"
t_center_statpb "gits.branchcn.com/backend/taskcenter/proto/go_proto/t_center_stat"
"gorm.io/gen"
"gorm.io/gen/field"
)
type List struct {
logic.Logic
Req *pb.ListReq
Res *pb.ListRes
}
func (s *List) Run() (err error) {
return logic.Run(s)
}
func (s *List) Exec() (err error) {
project, err := s.project()
if err != nil {
return
}
return s.list(project)
}
func (s *List) project() (project *model.Project, err error) {
project, err = finder.Project(s.Ctx, s.Req.GetProjectHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if project == nil {
err = workerr.NotFound("project not found")
return
}
return
}
func (s *List) list(project *model.Project) (err error) {
m := s.GetDao().RedeemMall
var cond = []gen.Condition{
m.ProjectID.Eq(project.ID),
m.IsDel.Eq(mtype.No),
}
if s.Req.GetTitle() != "" {
cond = append(cond, m.Title.Like(utils.DbAllLike(s.Req.GetTitle())))
}
if s.Req.GetStatus() != 0 {
cond = append(cond, m.Status.Eq(int8(s.Req.GetStatus())))
}
var orderBy []field.Expr
if len(s.Req.GetOrderBy()) == 0 {
// 排序字段(1-创建最晚优先,2-创建最早优先,3-使用中优先,4-暂未使用优先)
for _, v := range s.Req.GetOrderBy() {
switch v {
case 1:
orderBy = append(orderBy, m.CreatedAt.Desc())
case 2:
orderBy = append(orderBy, m.CreatedAt)
case 3:
orderBy = append(orderBy, m.Status)
case 4:
orderBy = append(orderBy, m.Status.Desc())
}
}
}
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
list, total, err := m.WithContext(s.Ctx).Where(cond...).Order(orderBy...).Order(m.ID.Desc()).FindByPage(offset, limit)
if err != nil {
err = s.BE().MysqlError(err)
return
}
if total == 0 {
return
}
var ids []int64
for _, v := range list {
ids = append(ids, v.ID)
}
relateMap, err := s._relate(ids)
if err != nil {
return
}
rewardMap, err := s._reward(project.ID, ids)
if err != nil {
return
}
s.Res.Total = total
s.Res.List = make([]*pb.ListRes_One, 0, len(list))
for _, v := range list {
one := &pb.ListRes_One{
Id: v.ID,
Title: v.Title,
Status: int32(v.Status),
CreatedAt: v.CreatedAt,
Rewards: rewardMap[v.ID],
Relates: relateMap[v.ID],
}
s.Res.List = append(s.Res.List, one)
}
return
}
func (s *List) _reward(projectId int64, ids []int64) (data map[int64][]*pb.ListRes_Reward, err error) {
data = make(map[int64][]*pb.ListRes_Reward, len(ids))
if len(ids) == 0 {
return
}
m := s.GetDao().RedeemMallItem
list, err := m.WithContext(s.Ctx).Where(
m.MallID.In(ids...),
m.DownAt.Eq(mtype.No),
m.IsDel.Eq(mtype.No),
m.UpAt.Lte(time.Now().Unix()),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var rewardMap = make(map[int64]string)
var rewardIds []int64
for _, v := range list {
if _, ok := rewardMap[v.RewardID]; !ok {
rewardIds = append(rewardIds, v.RewardID)
rewardMap[v.RewardID] = ""
}
}
preward, err := provider.NewRewards(s.Ctx, projectId, rewardIds...)
if err != nil {
return
}
for _, v := range list {
if !v.IsShow() {
continue
}
info, _ := preward.InfoAutoLang(v.RewardID)
data[v.MallID] = append(data[v.MallID], &pb.ListRes_Reward{
Id: v.ID,
Title: info.RewardTitle,
ImgUrl: info.ImgUrl,
})
}
return
}
func (s *List) _relate(ids []int64) (data map[int64][]*pb.ListRes_Relate, err error) {
data = make(map[int64][]*pb.ListRes_Relate, len(ids))
if len(ids) == 0 {
return
}
m := s.GetDao().RedeemMallRelate
list, err := m.WithContext(s.Ctx).Where(m.MallID.In(ids...), m.CancelTime.Eq(mtype.No)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var cpnIds, centerIds []int64
for _, v := range list {
switch v.Source {
case mtype.RedeemMallRelateSourceCenter:
centerIds = append(centerIds, v.RelateID)
case mtype.RedeemMallRelateSourceCampaign:
cpnIds = append(cpnIds, v.RelateID)
}
}
cpnTitle, err := s._cpnTitle(cpnIds)
if err != nil {
return
}
centerTitle, err := s._centerTitle(centerIds)
if err != nil {
return
}
for _, v := range list {
one := &pb.ListRes_Relate{
Id: v.ID,
Source: int32(v.Source),
}
switch v.Source {
case mtype.RedeemMallRelateSourceCenter:
one.Title = centerTitle[v.RelateID]
case mtype.RedeemMallRelateSourceCampaign:
one.Title = cpnTitle[v.RelateID]
}
data[v.MallID] = append(data[v.MallID], one)
}
return
}
func (s *List) _centerTitle(ids []int64) (data map[int64]string, err error) {
data = make(map[int64]string, len(ids))
if len(ids) == 0 {
return
}
res, err := app.NewTaskcenterCenterStat().DemTitle(s.Ctx, &t_center_statpb.DemTitleReq{
CenterIds: ids,
})
if err != nil {
return
}
for _, v := range res.GetCenters() {
data[v.GetId()] = v.GetTitle()
}
return
}
func (s *List) _cpnTitle(ids []int64) (data map[int64]string, err error) {
data = make(map[int64]string, len(ids))
if len(ids) == 0 {
return
}
m := s.GetDao().FissionCampaign
list, err := m.WithContext(s.Ctx).Where(m.ID.In(ids...)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
for _, v := range list {
data[v.ID] = v.Title
}
return
}