Skip to content

Commit

Permalink
支持缓存请求到的购物车商品及可配送时间
Browse files Browse the repository at this point in the history
  • Loading branch information
zc2638 committed Apr 17, 2022
1 parent 2047aa7 commit 08406e4
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 63 deletions.
5 changes: 0 additions & 5 deletions core/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,3 @@
// limitations under the License.

package core

type Interface interface {
Start() error
Stop()
}
21 changes: 13 additions & 8 deletions core/ddmc/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@ import (
"github.com/tidwall/gjson"
)

func (s *Session) CheckOrder(ctx context.Context, cartData map[string]interface{}, reserveTimes []ReserveTime) (map[string]interface{}, error) {
func (s *Session) CheckOrder(ctx context.Context, cartData map[string]interface{}, reserveTime *ReserveTime) (map[string]interface{}, error) {
urlPath := "https://maicai.api.ddxq.mobi/order/checkOrder"

packagesInfo := make(map[string]interface{})
for k, v := range cartData {
packagesInfo[k] = v
}
packagesInfo["reserved_time"] = map[string]interface{}{
"reserved_time_start": reserveTimes[0].StartTimestamp,
"reserved_time_end": reserveTimes[0].EndTimestamp,
"reserved_time_start": reserveTime.StartTimestamp,
"reserved_time_end": reserveTime.EndTimestamp,
}
packagesJson, err := json.Marshal([]interface{}{packagesInfo})
if err != nil {
Expand Down Expand Up @@ -74,12 +74,17 @@ func (s *Session) CheckOrder(ctx context.Context, cartData map[string]interface{
return out, nil
}

func (s *Session) CreateOrder(ctx context.Context, cartData map[string]interface{}, checkOrderData map[string]interface{}) error {
func (s *Session) CreateOrder(
ctx context.Context,
cartData map[string]interface{},
checkOrderData map[string]interface{},
reserveTime *ReserveTime,
) error {
urlPath := "https://maicai.api.ddxq.mobi/order/addNewOrder"

paymentOrder := map[string]interface{}{
"reserved_time_start": s.Reserve.StartTimestamp,
"reserved_time_end": s.Reserve.EndTimestamp,
"reserved_time_start": reserveTime.StartTimestamp,
"reserved_time_end": reserveTime.EndTimestamp,
"parent_order_sign": cartData["parent_order_sign"],
"address_id": s.Address.Id,
"pay_type": s.PayType,
Expand All @@ -96,8 +101,8 @@ func (s *Session) CreateOrder(ctx context.Context, cartData map[string]interface
}

packages := map[string]interface{}{
"reserved_time_start": s.Reserve.StartTimestamp,
"reserved_time_end": s.Reserve.EndTimestamp,
"reserved_time_start": reserveTime.StartTimestamp,
"reserved_time_end": reserveTime.EndTimestamp,
"products": cartData["products"],
"package_type": cartData["package_type"],
"package_id": cartData["package_id"],
Expand Down
90 changes: 40 additions & 50 deletions core/ddmc/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@ import (
"github.com/zc2638/ddshop/pkg/notice"
)

const maxRetryCount = 100

var (
ErrorNoValidProduct = errors.New("无有效商品")
ErrorNoReserveTime = errors.New("无可预约时间段")
Expand Down Expand Up @@ -101,7 +99,10 @@ type Session struct {
UserID string
PayType int64
Address *AddressItem
Reserve ReserveTime

cartData map[string]interface{}
multiReserveTime []ReserveTime
checkOrderData map[string]interface{}
}

func (s *Session) Run(ctx context.Context) error {
Expand All @@ -124,74 +125,61 @@ func (s *Session) Run(ctx context.Context) error {
}

func (s *Session) run(ctx context.Context) error {
logrus.Info("=====> 获取购物车中有效商品")

if err := s.CartAllCheck(ctx); err != nil {
return fmt.Errorf("全选购物车商品失败: %v", err)
}
cartData, err := s.GetCart(ctx)
if err != nil {
return err
if s.cartData == nil {
logrus.Info("=====> 获取购物车中有效商品")
if err := s.CartAllCheck(ctx); err != nil {
return fmt.Errorf("全选购物车商品失败: %v", err)
}
cartData, err := s.GetCart(ctx)
if err != nil {
return err
}
s.cartData = cartData
}

products := cartData["products"].([]map[string]interface{})
products := s.cartData["products"].([]map[string]interface{})
for k, v := range products {
logrus.Infof("[%v] %s 数量:%v 总价:%s", k, v["product_name"], v["count"], v["total_price"])
}

for {
if len(s.multiReserveTime) == 0 {
logrus.Info("=====> 获取可预约时间")
multiReserveTime, err := s.GetMultiReserveTime(ctx, products)
if err != nil {
return fmt.Errorf("获取可预约时间失败: %v", err)
}

if len(multiReserveTime) == 0 {
return ErrorNoReserveTime
}
logrus.Infof("发现可用的配送时段!")
s.multiReserveTime = multiReserveTime
}
reserveTime := s.multiReserveTime[0]

if s.checkOrderData == nil {
logrus.Info("=====> 生成订单信息")
checkOrderData, err := s.CheckOrder(ctx, cartData, multiReserveTime)
checkOrderData, err := s.CheckOrder(ctx, s.cartData, &reserveTime)
if err != nil {
return fmt.Errorf("检查订单失败: %v", err)
}
logrus.Infof("订单总金额:%v\n", checkOrderData["price"])

sess := s.Clone()
sess.SetReserve(multiReserveTime[0])

startTime := time.Unix(int64(sess.Reserve.StartTimestamp), 0).Format("2006/01/02 15:04:05")
endTime := time.Unix(int64(sess.Reserve.EndTimestamp), 0).Format("2006/01/02 15:04:05")
timeRange := startTime + "——" + endTime
logrus.Infof("=====> 提交订单中, 预约时间段(%s)", timeRange)
if err := sess.CreateOrder(context.Background(), cartData, checkOrderData); err != nil {
logrus.Errorf("提交订单(%s)失败: %v", timeRange, err)
return err
}

if err := s.noticeIns.Notice("抢菜成功", "叮咚买菜 抢菜成功,请尽快支付!"); err != nil {
logrus.Warningf("通知失败: %v", err)
}
return nil
s.checkOrderData = checkOrderData
logrus.Infof("订单总金额:%v\n", s.checkOrderData["price"])
}
}

func (s *Session) Clone() *Session {
return &Session{
cfg: s.cfg,
client: s.client,
startTime := time.Unix(int64(reserveTime.StartTimestamp), 0).Format("2006/01/02 15:04:05")
endTime := time.Unix(int64(reserveTime.EndTimestamp), 0).Format("2006/01/02 15:04:05")
timeRange := startTime + "——" + endTime

channel: s.channel,
apiVersion: s.apiVersion,
appVersion: s.appVersion,
appClientID: s.appClientID,
logrus.Infof("=====> 提交订单中, 预约时间段(%s)", timeRange)
if err := s.CreateOrder(context.Background(), s.cartData, s.checkOrderData, &reserveTime); err != nil {
logrus.Errorf("提交订单(%s)失败: %v", timeRange, err)
return err
}

UserID: s.UserID,
Address: s.Address,
PayType: s.PayType,
Reserve: s.Reserve,
if err := s.noticeIns.Notice("抢菜成功", "叮咚买菜 抢菜成功,请尽快支付!"); err != nil {
logrus.Warningf("通知失败: %v", err)
}
return nil
}

func (s *Session) execute(ctx context.Context, request *resty.Request, method, url string, count int) (*resty.Response, error) {
Expand Down Expand Up @@ -230,12 +218,18 @@ func (s *Session) execute(ctx context.Context, request *resty.Request, method, u
logrus.Warningf("将在 %dms 后重试, 当前人多拥挤(%v): %s", interval, code, msg)
time.Sleep(time.Duration(interval) * time.Millisecond)
case 5001:
s.cartData = nil
s.checkOrderData = nil
return nil, ErrorOutStock
case 5003:
s.cartData = nil
s.checkOrderData = nil
return nil, ErrorProductChange
case 5004:
s.multiReserveTime = nil
return nil, ErrorReserveTimeExpired
default:
s.checkOrderData = nil
return nil, fmt.Errorf("无法识别的状态码: %v", resp.String())
}
count--
Expand Down Expand Up @@ -289,10 +283,6 @@ func (s *Session) buildURLParams(needAddress bool) url.Values {
return params
}

func (s *Session) SetReserve(reserve ReserveTime) {
s.Reserve = reserve
}

func (s *Session) Choose() error {
if err := s.chooseAddr(); err != nil {
return err
Expand Down

0 comments on commit 08406e4

Please sign in to comment.