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 }