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.
165 lines
3.2 KiB
Go
165 lines
3.2 KiB
Go
package campaignuser
|
|
|
|
import (
|
|
"joybuywork/internal/consts"
|
|
"joybuywork/internal/plugins/jsonm"
|
|
"joybuywork/internal/repository/cache"
|
|
"joybuywork/internal/repository/finder"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/service/provider"
|
|
"joybuywork/internal/service/provider/malls"
|
|
"joybuywork/internal/service/provider/stocks"
|
|
"joybuywork/internal/utils/logic"
|
|
pb "joybuywork/proto/go_proto/w_campaign_user"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
"time"
|
|
)
|
|
|
|
type MallList struct {
|
|
logic.Logic
|
|
|
|
Req *pb.MallListReq
|
|
Res *pb.MallListRes
|
|
}
|
|
|
|
func (s *MallList) Run() (err error) {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *MallList) Data() (data jsonm.JsonM) {
|
|
data, _ = jsonm.Marshal(s.Req)
|
|
return
|
|
}
|
|
|
|
func (s *MallList) Exec() (err error) {
|
|
cpn, user, err := s.user()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
mallId, err := s.getMallId(cpn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return s.list(mallId, user.LangMark)
|
|
}
|
|
|
|
func (s *MallList) user() (cpn *model.FissionCampaign, user *model.FissionUser, err error) {
|
|
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if cpn == nil || cpn.IsDel == mtype.Yes {
|
|
err = workerr.NotFound("not found cpn")
|
|
return
|
|
}
|
|
|
|
user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if user == nil {
|
|
err = workerr.UnauthorizedError
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *MallList) list(mallId int64, langMark string) (err error) {
|
|
mall, err := malls.NewMall(s.Ctx, mallId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
list, err := mall.UpItems()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
var showList []*model.RedeemMallItem
|
|
for _, v := range list {
|
|
if v.IsShow() {
|
|
showList = append(showList, v)
|
|
}
|
|
}
|
|
|
|
var rewardMap = make(map[int64]struct{})
|
|
var rewardIds []int64
|
|
var ids []int64
|
|
for _, v := range showList {
|
|
ids = append(ids, v.ID)
|
|
if _, ok := rewardMap[v.ID]; !ok {
|
|
rewardMap[v.RewardID] = struct{}{}
|
|
rewardIds = append(rewardIds, v.RewardID)
|
|
}
|
|
}
|
|
|
|
useStockMap, err := s._useStock(ids)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
preward, err := provider.NewRewards(s.Ctx, mall.GetMall().ProjectID, rewardIds...)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
s.Res.List = make([]*pb.MallListRes_One, 0, len(showList))
|
|
|
|
for _, v := range showList {
|
|
info, _ := preward.InfoAutoLang(v.RewardID, langMark)
|
|
s.Res.List = append(s.Res.List, &pb.MallListRes_One{
|
|
Id: v.ID,
|
|
RewardId: v.RewardID,
|
|
Title: info.Title,
|
|
ImgUrl: info.ImgUrl,
|
|
Remain: v.Stock - useStockMap[v.ID],
|
|
Status: v.GetStatus(),
|
|
UpRemain: v.UpAt - time.Now().Unix(),
|
|
CoinNum: v.CoinNum,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *MallList) _useStock(ids []int64) (data map[int64]int64, err error) {
|
|
data = make(map[int64]int64)
|
|
if len(ids) == 0 {
|
|
return
|
|
}
|
|
|
|
stock, err := stocks.NewMallItem(s.Ctx, ids...)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
data, err = stock.AllUseStock()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *MallList) getMallId(cpn *model.FissionCampaign) (mallId int64, err error) {
|
|
switch cpn.FissionID {
|
|
case consts.IdVs:
|
|
conf, err1 := cache.NewCampaignVs(s.Ctx).FindByCampaignId(cpn.ID)
|
|
if err1 != nil {
|
|
err = s.BE().CacheError(err1)
|
|
return
|
|
}
|
|
mallId = conf.MallID
|
|
}
|
|
|
|
return
|
|
}
|