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.
191 lines
3.7 KiB
Go
191 lines
3.7 KiB
Go
package mall
|
|
|
|
import (
|
|
"joybuywork/internal/repository/cache"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/service/provider/stocks"
|
|
"joybuywork/internal/utils/logic"
|
|
pb "joybuywork/proto/go_proto/w_mall"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
"time"
|
|
|
|
"gorm.io/gen/field"
|
|
)
|
|
|
|
type ItemStatus struct {
|
|
logic.Logic
|
|
|
|
Req *pb.ItemStatusReq
|
|
Res *pb.ItemStatusRes
|
|
}
|
|
|
|
func (s *ItemStatus) Run() (err error) {
|
|
return logic.Run(s)
|
|
}
|
|
|
|
func (s *ItemStatus) Exec() (err error) {
|
|
item, err := s.item()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return s.status(item)
|
|
}
|
|
|
|
func (s *ItemStatus) 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 *ItemStatus) status(item *model.RedeemMallItem) (err error) {
|
|
switch s.Req.GetStatus() {
|
|
case 1: //上架
|
|
err = s._up(item)
|
|
if err != nil {
|
|
return
|
|
}
|
|
case 2: //下架
|
|
err = s._down(item)
|
|
if err != nil {
|
|
return
|
|
}
|
|
case 3: //删除
|
|
err = s._delete(item)
|
|
if err != nil {
|
|
return
|
|
}
|
|
default:
|
|
return s.BE().VerifyError("invalid status")
|
|
}
|
|
|
|
s.AddAfterRun(func() (err error) {
|
|
return cache.NewRedeemMallItem(s.Ctx).Clear(item)
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ItemStatus) _up(item *model.RedeemMallItem) (err error) {
|
|
if item.GetStatus() == mtype.RedeemMallItemStatusUp {
|
|
return
|
|
}
|
|
|
|
if item.GetStatus() != mtype.RedeemMallItemStatusWait {
|
|
return s.BE().VerifyError("Not a item waiting to be listed")
|
|
}
|
|
|
|
m := s.GetDao().RedeemMallItem
|
|
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(item.ID)).UpdateSimple(
|
|
m.UpAt.Value(time.Now().Unix()),
|
|
m.UpFrom.Value(mtype.RedeemMallItemUpFromManual),
|
|
)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ItemStatus) _down(item *model.RedeemMallItem) (err error) {
|
|
if item.GetStatus() == mtype.RedeemMallItemStatusDown {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().RedeemMallItem
|
|
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(item.ID)).UpdateSimple(
|
|
m.DownAt.Value(time.Now().Unix()),
|
|
m.DownFrom.Value(mtype.RedeemMallItemDownFromManual),
|
|
)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return s._task(item, mtype.RedeemMallItemTaskMarkDown)
|
|
}
|
|
|
|
func (s *ItemStatus) _delete(item *model.RedeemMallItem) (err error) {
|
|
if item.GetStatus() == mtype.RedeemMallItemStatusDel {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().RedeemMallItem
|
|
var up = []field.AssignExpr{
|
|
m.IsDel.Value(mtype.Yes),
|
|
}
|
|
|
|
if item.GetStatus() != mtype.RedeemMallItemStatusDown {
|
|
up = append(
|
|
up,
|
|
m.DownAt.Value(time.Now().Unix()),
|
|
m.DownFrom.Value(mtype.RedeemMallItemDownFromDel),
|
|
)
|
|
|
|
err = s._task(item, mtype.RedeemMallItemTaskMarkDown)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(item.ID)).UpdateSimple(up...)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *ItemStatus) _task(item *model.RedeemMallItem, mark string) (err error) {
|
|
|
|
m := s.GetDao().RedeemMallItemTask
|
|
task, err := m.WithContext(s.Ctx).Where(m.ItemID.Eq(item.ID), m.Mark.Eq(mark)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if task == nil {
|
|
return
|
|
}
|
|
|
|
switch task.Mark {
|
|
case mtype.RedeemMallItemTaskMarkDown:
|
|
|
|
var stock *stocks.MallItem
|
|
stock, err = stocks.NewMallItem(s.Ctx, item.ID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
useNum, _ := stock.GetUseStock(item.ID)
|
|
|
|
itemM := s.GetDao().RedeemMallItem
|
|
_, err = itemM.WithContext(s.Ctx).Where(itemM.ID.Eq(item.ID)).UpdateSimple(
|
|
itemM.UseStock.Value(useNum),
|
|
)
|
|
if err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
}
|