- status judge.
This commit is contained in:
@@ -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) = ?
|
WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ?
|
||||||
AND t1.order_created_at >= ?
|
AND t1.order_created_at >= ?
|
||||||
AND t1.Status >= ? AND t1.Status <= ?
|
AND t1.Status >= ? AND t1.Status <= ?
|
||||||
LIMIT ? OFFSET ?
|
|
||||||
ORDER BY t1.order_created_at
|
ORDER BY t1.order_created_at
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
`, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus, pageSize, offset).QueryRows(&orders)
|
`, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus, pageSize, offset).QueryRows(&orders)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return orders, nil
|
return orders, nil
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package basesch
|
package basesch
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
@@ -21,10 +20,6 @@ var (
|
|||||||
FixedBaseScheduler *BaseScheduler
|
FixedBaseScheduler *BaseScheduler
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
ErrOrderStatusIsNotSuitable = errors.New("订单状态不适合当前操作")
|
|
||||||
)
|
|
||||||
|
|
||||||
func (c *BaseScheduler) Init() {
|
func (c *BaseScheduler) Init() {
|
||||||
c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler)
|
c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler)
|
||||||
c.DeliveryPlatformHandlers = make(map[int]*scheduler.DeliveryPlatformHandlerInfo)
|
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)
|
}, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
||||||
}
|
}
|
||||||
} else {
|
} 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
|
return err
|
||||||
}
|
}
|
||||||
@@ -85,9 +81,12 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, userName string) (e
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusAccepted {
|
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
|
return err
|
||||||
}
|
}
|
||||||
@@ -104,10 +103,13 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder, userName str
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusFinishedPickup {
|
if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusFinishedPickup || order.VendorID == order.WaybillVendorID {
|
||||||
err = ErrOrderStatusIsNotSuitable
|
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
|
return err
|
||||||
}
|
}
|
||||||
@@ -121,7 +123,13 @@ func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder, userName s
|
|||||||
}, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID)
|
}, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID)
|
||||||
}
|
}
|
||||||
} else {
|
} 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
|
return err
|
||||||
}
|
}
|
||||||
@@ -137,10 +145,14 @@ func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder, userName
|
|||||||
order.Status = model.OrderStatusDelivering
|
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 {
|
} 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
|
return err
|
||||||
}
|
}
|
||||||
@@ -154,7 +166,13 @@ func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder, userName
|
|||||||
}, "SelfDeliverDelievered orderID:%s", order.VendorOrderID)
|
}, "SelfDeliverDelievered orderID:%s", order.VendorOrderID)
|
||||||
}
|
}
|
||||||
} else {
|
} 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
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ func init() {
|
|||||||
TimeoutAction: func(savedOrderInfo *WatchOrderInfo) (err error) {
|
TimeoutAction: func(savedOrderInfo *WatchOrderInfo) (err error) {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
_ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error {
|
_ = 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 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 {
|
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) {
|
func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInfo, bill *model.Waybill, retryCount int, duration time.Duration) {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID)
|
||||||
if order.WaybillVendorID != order.VendorID {
|
if !savedOrderInfo.isSwitched2SelfDelivery {
|
||||||
if err := s.Swtich2SelfDeliver(order, ""); err != nil {
|
if order.WaybillVendorID != order.VendorID {
|
||||||
globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err)
|
if err := s.Swtich2SelfDeliver(order, ""); err != nil && err != scheduler.ErrOrderStatusAlreadySatisfyCurOperation {
|
||||||
if retryCount > 0 {
|
globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err)
|
||||||
time.AfterFunc(duration, func() {
|
if retryCount > 0 {
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
time.AfterFunc(duration, func() {
|
||||||
s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, retryCount-1, duration)
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
}, order.VendorOrderID)
|
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)
|
} else {
|
||||||
|
globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err)
|
||||||
|
|
||||||
tmpLog := &legacymodel.TempLog{
|
tmpLog := &legacymodel.TempLog{
|
||||||
VendorOrderID: bill.VendorWaybillID,
|
VendorOrderID: bill.VendorWaybillID,
|
||||||
RefVendorOrderID: order.VendorOrderID,
|
RefVendorOrderID: order.VendorOrderID,
|
||||||
Msg: fmt.Sprintf("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err),
|
Msg: fmt.Sprintf("swtich2SelfDeliverWithRetry finally failed, orderID:%s bill:%v, err:%v", order.VendorOrderID, bill, err),
|
||||||
}
|
}
|
||||||
db := orm.NewOrm()
|
db := orm.NewOrm()
|
||||||
db.Insert(tmpLog)
|
db.Insert(tmpLog)
|
||||||
|
|
||||||
if s.CancelWaybill(bill, partner.CancelWaybillReasonSwitch2SelfFailed, partner.CancelWaybillReasonStrSwitch2SelfFailed) == nil {
|
if s.CancelWaybill(bill, partner.CancelWaybillReasonSwitch2SelfFailed, partner.CancelWaybillReasonStrSwitch2SelfFailed) == nil {
|
||||||
// 转自送失败的取消,要将订单中的运单状态更新
|
// 转自送失败的取消,要将订单中的运单状态更新
|
||||||
if s.isBillCandidate(order, bill) {
|
if s.isBillCandidate(order, bill) {
|
||||||
bill.WaybillVendorID = model.VendorIDUnknown
|
bill.WaybillVendorID = model.VendorIDUnknown
|
||||||
s.updateOrderByBill(order, bill, false)
|
s.updateOrderByBill(order, bill, false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
savedOrderInfo.isSwitched2SelfDelivery = true
|
||||||
}
|
}
|
||||||
} else {
|
} 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) {
|
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 {
|
func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Waybill) bool {
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrStatusIsNotOKForOperation = errors.New("当前状态操作无效")
|
ErrOrderStatusIsNotSuitable4CurOperation = errors.New("订单状态不适合当前操作")
|
||||||
|
ErrOrderStatusAlreadySatisfyCurOperation = errors.New("订单当前状态已满足当前操作")
|
||||||
|
|
||||||
ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建")
|
ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建")
|
||||||
ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)")
|
ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)")
|
||||||
ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)")
|
ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)")
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func TestCreateWaybill(t *testing.T) {
|
|||||||
VendorOrderID: orderID,
|
VendorOrderID: orderID,
|
||||||
WaybillVendorID: model.VendorIDDada,
|
WaybillVendorID: model.VendorIDDada,
|
||||||
}
|
}
|
||||||
err = c.CancelWaybill(bill)
|
err = c.CancelWaybill(bill, partner.CancelWaybillReasonOther, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func TestCancelWaybill(t *testing.T) {
|
|||||||
VendorWaybillID2: "55",
|
VendorWaybillID2: "55",
|
||||||
}
|
}
|
||||||
c := new(DeliveryHandler)
|
c := new(DeliveryHandler)
|
||||||
if err := c.CancelWaybill(bill); err != nil {
|
if err := c.CancelWaybill(bill, partner.CancelWaybillReasonOther, ""); err != nil {
|
||||||
t.Fatal(err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func TestSwitch2SelfDeliver(t *testing.T) {
|
|||||||
if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil {
|
if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil {
|
||||||
// globals.SugarLogger.Debug(order)
|
// globals.SugarLogger.Debug(order)
|
||||||
c := new(PurchaseHandler)
|
c := new(PurchaseHandler)
|
||||||
if err = c.Swtich2SelfDeliver(order); err == nil {
|
if err = c.Swtich2SelfDeliver(order, ""); err == nil {
|
||||||
} else {
|
} else {
|
||||||
t.Fatal(err.Error())
|
t.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user