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