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.

154 lines
3.3 KiB
Go

package mall
import (
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/provider/stocks"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_mall"
"joybuywork/proto/go_proto/workerr"
"time"
)
const (
downTaskDel = iota + 1
downTaskAdd
downTaskChange
)
type ItemUpdate struct {
logic.Logic
Req *pb.ItemUpdateReq
Res *pb.ItemUpdateRes
changeStock bool
downTask int
}
func (s *ItemUpdate) Run() (err error) {
return logic.Run(s)
}
func (s *ItemUpdate) Exec() (err error) {
item, err := s.item()
if err != nil {
return
}
err = s.update(item)
if err != nil {
return
}
return s.task(item)
}
func (s *ItemUpdate) item() (item *model.RedeemMallItem, err error) {
item, err = cache.NewRedeemMallItem(s.Ctx).FindById(s.Req.GetId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if item == nil {
err = workerr.NotFound("not_found item")
return
}
s.Res.Id = item.ID
return
}
func (s *ItemUpdate) update(item *model.RedeemMallItem) (err error) {
if item.Stock != s.Req.GetStock() {
s.changeStock = true
}
if item.DownType != int8(s.Req.GetDownType()) {
switch s.Req.GetDownCustom() {
case mtype.RedeemMallItemDownTypeNone:
s.downTask = downTaskDel
case mtype.RedeemMallItemDownTypeCustom:
s.downTask = downTaskAdd
}
} else if item.DownCustom != s.Req.GetDownCustom() {
s.downTask = downTaskChange
}
item.RewardID = s.Req.GetRewardId()
item.Stock = s.Req.GetStock()
item.CoinNum = s.Req.GetCoinNum()
item.UpType = int8(s.Req.GetUpType())
item.DownType = int8(s.Req.GetDownType())
item.DownCustom = s.Req.GetDownCustom()
switch s.Req.GetUpType() {
case mtype.RedeemMallItemUpTypeNow:
item.UpAt = time.Now().Unix()
item.UpFrom = mtype.RedeemMallItemUpFromNow
case mtype.RedeemMallItemUpTypeCustom:
item.UpCustom = s.Req.GetUpCustom()
item.UpAt = s.Req.GetUpCustom()
item.UpFrom = mtype.RedeemMallItemUpFromTiming
}
item.SetUpShow(s.Req.GetUpShow())
item.SetDownShow(s.Req.GetDownShow())
m := s.GetDao().RedeemMallItem
if err = m.WithContext(s.Ctx).Save(item); err != nil {
err = s.BE().MysqlError(err)
return
}
s.AddAfterRun(func() (err error) {
return cache.NewRedeemMallItem(s.Ctx).Clear(item)
})
return
}
func (s *ItemUpdate) task(item *model.RedeemMallItem) (err error) {
switch s.downTask {
case downTaskDel:
m := s.GetDao().RedeemMallItemTask
if _, err = m.WithContext(s.Ctx).Where(m.ItemID.Eq(item.ID)).Delete(); err != nil {
err = s.BE().MysqlError(err)
return
}
case downTaskAdd:
task := withdefault.RedeemMallItemTask(&model.RedeemMallItemTask{
ItemID: item.ID,
DoAt: item.DownCustom,
Mark: mtype.RedeemMallItemTaskMarkDown,
})
if err = s.GetDao().RedeemMallItemTask.WithContext(s.Ctx).Create(task); err != nil {
err = s.BE().MysqlError(err)
return
}
case downTaskChange:
m := s.GetDao().RedeemMallItemTask
if _, err = m.WithContext(s.Ctx).Where(m.ItemID.Eq(item.ID)).UpdateSimple(m.DoAt.Value(item.DownCustom)); err != nil {
err = s.BE().MysqlError(err)
return
}
}
if s.changeStock {
var stock *stocks.MallItem
stock, err = stocks.NewMallItem(s.Ctx, item.ID)
if err != nil {
return
}
stock.Clear()
}
return
}