From 5f10f010278944c93c2627610f0364b59761dd32 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 23 Aug 2018 11:51:20 +0800 Subject: [PATCH] - status judge. --- business/jxcallback/orderman/orderman_ext.go | 2 +- .../jxcallback/scheduler/basesch/basesch.go | 50 +++++++++----- .../jxcallback/scheduler/defsch/defsch.go | 66 ++++++++++--------- business/jxcallback/scheduler/scheduler.go | 4 +- .../partner/delivery/dada/waybill_test.go | 2 +- .../partner/delivery/mtps/waybill_test.go | 2 +- business/partner/purchase/jd/order_test.go | 2 +- 7 files changed, 77 insertions(+), 51 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 68a365074..8c35ffced 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -44,8 +44,8 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.Status >= ? AND t1.Status <= ? - LIMIT ? OFFSET ? ORDER BY t1.order_created_at + LIMIT ? OFFSET ? `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus, pageSize, offset).QueryRows(&orders) if err == nil { return orders, nil diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index fe7271167..5f8154bf5 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -1,7 +1,6 @@ package basesch import ( - "errors" "fmt" "git.rosy.net.cn/baseapi/utils" @@ -21,10 +20,6 @@ var ( FixedBaseScheduler *BaseScheduler ) -var ( - ErrOrderStatusIsNotSuitable = errors.New("订单状态不适合当前操作") -) - func (c *BaseScheduler) Init() { c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler) c.DeliveryPlatformHandlers = make(map[int]*scheduler.DeliveryPlatformHandlerInfo) @@ -70,7 +65,8 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) } } else { - globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, status:%d is not suitable, isAcceptIt:%t", order.VendorOrderID, order.Status, isAcceptIt) + return scheduler.ErrOrderStatusAlreadySatisfyCurOperation + globals.SugarLogger.Debugf("AcceptOrRefuseOrder orderID:%s, status:%d is not suitable, isAcceptIt:%t", order.VendorOrderID, order.Status, isAcceptIt) } return err } @@ -85,9 +81,12 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, userName string) (e } } else { if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusAccepted { - err = ErrOrderStatusIsNotSuitable + err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation + globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } else { + err = scheduler.ErrOrderStatusAlreadySatisfyCurOperation + globals.SugarLogger.Debugf("PickupGoods orderID:%s status:%d already ok", order.VendorOrderID, order.Status) } - globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) } return err } @@ -104,10 +103,13 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder, userName str } } } else { - if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusFinishedPickup { - err = ErrOrderStatusIsNotSuitable + if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusFinishedPickup || order.VendorID == order.WaybillVendorID { + err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation + globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } else { + err = scheduler.ErrOrderStatusAlreadySatisfyCurOperation + globals.SugarLogger.Debugf("Swtich2SelfDeliver orderID:%s status:%d already ok", order.VendorOrderID, order.Status) } - globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) } return err } @@ -121,7 +123,13 @@ func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder, userName s }, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID) } } else { - globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusDelivering { + err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation + globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } else { + err = scheduler.ErrOrderStatusAlreadySatisfyCurOperation + globals.SugarLogger.Debugf("Swtich2SelfDelivered orderID:%s status:%d already ok", order.VendorOrderID, order.Status) + } } return err } @@ -137,10 +145,14 @@ func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder, userName order.Status = model.OrderStatusDelivering } } - } else if order.Status == model.OrderStatusDelivering { - globals.SugarLogger.Debugf("SelfDeliverDelievering orderID:%s, status:%d already ok", order.VendorOrderID, order.Status) } else { - globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusFinishedPickup { + err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation + globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } else { + err = scheduler.ErrOrderStatusAlreadySatisfyCurOperation + globals.SugarLogger.Debugf("SelfDeliverDelievering orderID:%s, status:%d already ok", order.VendorOrderID, order.Status) + } } return err } @@ -154,7 +166,13 @@ func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder, userName }, "SelfDeliverDelievered orderID:%s", order.VendorOrderID) } } else { - globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusDelivering { + err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation + globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } else { + err = scheduler.ErrOrderStatusAlreadySatisfyCurOperation + globals.SugarLogger.Debugf("SelfDeliverDelievered orderID:%s, status:%d already ok", order.VendorOrderID, order.Status) + } } return err } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 5ec3e05a6..cc3816f28 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -152,7 +152,7 @@ func init() { TimeoutAction: func(savedOrderInfo *WatchOrderInfo) (err error) { order := savedOrderInfo.order _ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error { - if err = sch.AcceptOrRefuseOrder(order, isAcceptIt, ""); err != nil { + if err = sch.AcceptOrRefuseOrder(order, isAcceptIt, ""); err != nil && err != scheduler.ErrOrderStatusAlreadySatisfyCurOperation { // 为了解决京东新消息与接单消息乱序的问题 if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 { if order2, err2 := sch.GetPurchasePlatformFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil && order2.Status > order.Status { @@ -477,41 +477,43 @@ func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2 func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInfo, bill *model.Waybill, retryCount int, duration time.Duration) { order := savedOrderInfo.order globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID) - if order.WaybillVendorID != order.VendorID { - if err := s.Swtich2SelfDeliver(order, ""); err != nil { - globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err) - if retryCount > 0 { - time.AfterFunc(duration, func() { - jxutils.CallMsgHandlerAsync(func() { - s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, retryCount-1, duration) - }, order.VendorOrderID) - }) - } else { - globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err) + if !savedOrderInfo.isSwitched2SelfDelivery { + if order.WaybillVendorID != order.VendorID { + if err := s.Swtich2SelfDeliver(order, ""); err != nil && err != scheduler.ErrOrderStatusAlreadySatisfyCurOperation { + globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err) + if retryCount > 0 { + time.AfterFunc(duration, func() { + jxutils.CallMsgHandlerAsync(func() { + s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, retryCount-1, duration) + }, order.VendorOrderID) + }) + } else { + globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err) - tmpLog := &legacymodel.TempLog{ - VendorOrderID: bill.VendorWaybillID, - RefVendorOrderID: order.VendorOrderID, - Msg: fmt.Sprintf("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err), - } - db := orm.NewOrm() - db.Insert(tmpLog) + tmpLog := &legacymodel.TempLog{ + VendorOrderID: bill.VendorWaybillID, + RefVendorOrderID: order.VendorOrderID, + Msg: fmt.Sprintf("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err), + } + db := orm.NewOrm() + db.Insert(tmpLog) - if s.CancelWaybill(bill, partner.CancelWaybillReasonSwitch2SelfFailed, partner.CancelWaybillReasonStrSwitch2SelfFailed) == nil { - // 转自送失败的取消,要将订单中的运单状态更新 - if s.isBillCandidate(order, bill) { - bill.WaybillVendorID = model.VendorIDUnknown - s.updateOrderByBill(order, bill, false) + if s.CancelWaybill(bill, partner.CancelWaybillReasonSwitch2SelfFailed, partner.CancelWaybillReasonStrSwitch2SelfFailed) == nil { + // 转自送失败的取消,要将订单中的运单状态更新 + if s.isBillCandidate(order, bill) { + bill.WaybillVendorID = model.VendorIDUnknown + s.updateOrderByBill(order, bill, false) + } } } + } else { + savedOrderInfo.isSwitched2SelfDelivery = true } } else { - savedOrderInfo.isSwitched2SelfDelivery = true + // 进到这里的原因是,在这个时间点,购物平台物流已经抢单(但抢单消息还没有被收到),所以转自送会失败 (比如:818810379000941),更好的做法应该是判断Swtich2SelfDeliver的返回值,这种情况下就不得试了 + globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry orderID:%s status is wrong(maybe purchase platform accepted waybill)", order.VendorOrderID) + // globals.SugarLogger.Warnf("swtich2SelfDeliverWithRetry orderID:%s status is wrong, order details:%v", order.VendorOrderID, order) } - } else { - // 进到这里的原因是,在这个时间点,购物平台物流已经抢单(但抢单消息还没有被收到),所以转自送会失败 (比如:818810379000941),更好的做法应该是判断Swtich2SelfDeliver的返回值,这种情况下就不得试了 - globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry orderID:%s status is wrong(maybe purchase platform accepted waybill)", order.VendorOrderID) - // globals.SugarLogger.Warnf("swtich2SelfDeliverWithRetry orderID:%s status is wrong, order details:%v", order.VendorOrderID, order) } } @@ -697,7 +699,11 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa } func (s *DefScheduler) autoPickupGood(order *model.GoodsOrder) (err error) { - return s.PickupGoods(order, "") + err = s.PickupGoods(order, "") + if err == scheduler.ErrOrderStatusAlreadySatisfyCurOperation { + err = nil + } + return err } func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Waybill) bool { diff --git a/business/jxcallback/scheduler/scheduler.go b/business/jxcallback/scheduler/scheduler.go index b76c402e0..4669975e5 100644 --- a/business/jxcallback/scheduler/scheduler.go +++ b/business/jxcallback/scheduler/scheduler.go @@ -33,7 +33,9 @@ var ( ) var ( - ErrStatusIsNotOKForOperation = errors.New("当前状态操作无效") + ErrOrderStatusIsNotSuitable4CurOperation = errors.New("订单状态不适合当前操作") + ErrOrderStatusAlreadySatisfyCurOperation = errors.New("订单当前状态已满足当前操作") + ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建") ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)") ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)") diff --git a/business/partner/delivery/dada/waybill_test.go b/business/partner/delivery/dada/waybill_test.go index 2bd0031aa..2ec620af0 100644 --- a/business/partner/delivery/dada/waybill_test.go +++ b/business/partner/delivery/dada/waybill_test.go @@ -34,7 +34,7 @@ func TestCreateWaybill(t *testing.T) { VendorOrderID: orderID, WaybillVendorID: model.VendorIDDada, } - err = c.CancelWaybill(bill) + err = c.CancelWaybill(bill, partner.CancelWaybillReasonOther, "") if err != nil { t.Fatal(err.Error()) } diff --git a/business/partner/delivery/mtps/waybill_test.go b/business/partner/delivery/mtps/waybill_test.go index 64a12d88d..284065337 100644 --- a/business/partner/delivery/mtps/waybill_test.go +++ b/business/partner/delivery/mtps/waybill_test.go @@ -38,7 +38,7 @@ func TestCancelWaybill(t *testing.T) { VendorWaybillID2: "55", } c := new(DeliveryHandler) - if err := c.CancelWaybill(bill); err != nil { + if err := c.CancelWaybill(bill, partner.CancelWaybillReasonOther, ""); err != nil { t.Fatal(err.Error()) } } diff --git a/business/partner/purchase/jd/order_test.go b/business/partner/purchase/jd/order_test.go index 05890349e..b5e906203 100644 --- a/business/partner/purchase/jd/order_test.go +++ b/business/partner/purchase/jd/order_test.go @@ -26,7 +26,7 @@ func TestSwitch2SelfDeliver(t *testing.T) { if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) c := new(PurchaseHandler) - if err = c.Swtich2SelfDeliver(order); err == nil { + if err = c.Swtich2SelfDeliver(order, ""); err == nil { } else { t.Fatal(err.Error()) }