|
|
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
|
|
|
}
|