- all call CallFuncLogError add order info
- callLegacyMsgHandler, callNewMsgHandler and generateLegacyJxOrder config - call legacy lefted msg handler in new process(elm urge order and bad comment on jd)
This commit is contained in:
@@ -40,6 +40,7 @@ type DefScheduler struct {
|
||||
|
||||
func init() {
|
||||
sch := &DefScheduler{}
|
||||
sch.IsReallyCallPlatformAPI = globals.ReallyCallPlatformAPI
|
||||
sch.Init()
|
||||
scheduler.CurrentScheduler = sch
|
||||
sch.defWorkflowConfig = map[int]*scheduler.StatusActionConfig{
|
||||
@@ -47,7 +48,7 @@ func init() {
|
||||
Timeout: 1 * time.Second,
|
||||
TimeoutAction: func(order *model.GoodsOrder) (err error) {
|
||||
_ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error {
|
||||
return sch.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt)
|
||||
return sch.AcceptOrRefuseOrder(order, isAcceptIt)
|
||||
})
|
||||
return nil
|
||||
},
|
||||
@@ -55,7 +56,7 @@ func init() {
|
||||
model.OrderStatusAccepted: &scheduler.StatusActionConfig{ // 自动拣货
|
||||
Timeout: time2AutoPickupMin,
|
||||
TimeoutAction: func(order *model.GoodsOrder) (err error) {
|
||||
return sch.GetPurchasePlatformFromVendorID(order.VendorID).PickedUpGoods(order)
|
||||
return sch.PickedUpGoods(order)
|
||||
},
|
||||
},
|
||||
model.OrderStatusFinishedPickup: &scheduler.StatusActionConfig{ // 尝试召唤更多物流
|
||||
@@ -128,7 +129,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
|
||||
if savedOrderInfo.order.WaybillVendorID != model.VendorIDUnknown {
|
||||
globals.SugarLogger.Infof("OnWaybillStatusChanged multiple waybill created, bill:%v", bill)
|
||||
if bill.WaybillVendorID != bill.WaybillVendorID {
|
||||
s.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID).CancelWaybill(bill)
|
||||
s.CancelWaybill(bill)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -161,12 +162,12 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
|
||||
}
|
||||
case model.WaybillStatusDelivering:
|
||||
if savedOrderInfo.order.VendorID != bill.WaybillVendorID {
|
||||
s.GetPurchasePlatformFromVendorID(bill.OrderVendorID).SelfDeliverDelievering(savedOrderInfo.order)
|
||||
s.SelfDeliverDelievering(savedOrderInfo.order)
|
||||
}
|
||||
case model.WaybillStatusDelivered:
|
||||
s.removeWaybillFromMap(savedOrderInfo, bill)
|
||||
if savedOrderInfo.order.VendorID != bill.WaybillVendorID {
|
||||
s.GetPurchasePlatformFromVendorID(bill.OrderVendorID).SelfDeliverDelievered(savedOrderInfo.order)
|
||||
s.SelfDeliverDelievered(savedOrderInfo.order)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -198,11 +199,11 @@ func (s *DefScheduler) removeWaybillFromMap(savedOrderInfo *WatchOrderInfo, bill
|
||||
}
|
||||
|
||||
func (s *DefScheduler) createWaybillOn3rdProviders(order *model.GoodsOrder, excludeBill *model.Waybill) (err error) {
|
||||
globals.SugarLogger.Debugf("createWaybillOn3rdProviders, order:%v", order)
|
||||
globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, excludeBill:%v", order.VendorOrderID, excludeBill)
|
||||
successCount := 0
|
||||
for k, v := range s.DeliveryPlatformHandlers {
|
||||
if excludeBill == nil || k != excludeBill.WaybillVendorID {
|
||||
if err = v.CreateWaybill(order); err == nil {
|
||||
for vendorID := range s.DeliveryPlatformHandlers {
|
||||
if excludeBill == nil || vendorID != excludeBill.WaybillVendorID {
|
||||
if err = s.CreateWaybill(vendorID, order); err == nil {
|
||||
successCount++
|
||||
}
|
||||
}
|
||||
@@ -210,28 +211,35 @@ func (s *DefScheduler) createWaybillOn3rdProviders(order *model.GoodsOrder, excl
|
||||
if successCount != 0 {
|
||||
return nil
|
||||
}
|
||||
globals.SugarLogger.Warnf("createWaybillOn3rdProviders, orderID:%s all failed", order.VendorOrderID)
|
||||
return scheduler.ErrCanNotCreateAtLeastOneWaybill
|
||||
}
|
||||
|
||||
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
|
||||
globals.SugarLogger.Debugf("cancelOtherWaybills, order:%v, bill:%v", savedOrderInfo.order, bill)
|
||||
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill)
|
||||
for _, v := range savedOrderInfo.waybills {
|
||||
if (v.OrderVendorID != v.WaybillVendorID) && (bill == nil || !(v.WaybillVendorID == bill.WaybillVendorID && v.VendorWaybillID == bill.VendorWaybillID)) {
|
||||
_ = s.GetDeliveryPlatformFromVendorID(v.WaybillVendorID).CancelWaybill(v)
|
||||
s.CancelWaybill(v)
|
||||
}
|
||||
}
|
||||
if bill != nil && bill.WaybillVendorID != bill.OrderVendorID {
|
||||
s.swtich2SelfDeliverWithRetry(bill, 2, 10*time.Second)
|
||||
s.swtich2SelfDeliverWithRetry(savedOrderInfo.order, bill, 2, 10*time.Second)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *DefScheduler) swtich2SelfDeliverWithRetry(bill *model.Waybill, retryCount int, duration time.Duration) {
|
||||
// todo 这个函数也可能有线程安全问题
|
||||
func (s *DefScheduler) swtich2SelfDeliverWithRetry(order *model.GoodsOrder, bill *model.Waybill, retryCount int, duration time.Duration) {
|
||||
globals.SugarLogger.Debugf("Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
|
||||
utils.CallFuncRetryAsync(func(index int) error {
|
||||
err := s.GetPurchasePlatformFromVendorID(bill.OrderVendorID).Swtich2SelfDeliver(bill.VendorOrderID)
|
||||
if err != nil && index == 0 {
|
||||
// 如果购买平台转商家自送失败,最终还是要取消3方物流
|
||||
s.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID).CancelWaybill(bill)
|
||||
err := s.Swtich2SelfDeliver(order)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Infof("Swtich2SelfDeliver failed, orderID:%s, error:%v", order.VendorOrderID, err)
|
||||
if err != nil && index == 0 {
|
||||
globals.SugarLogger.Warnf("Swtich2SelfDeliver finally failed, orderID:%s, error:%v, have to cancel bill:%v", order.VendorOrderID, err, bill)
|
||||
// 如果购买平台转商家自送失败,最终还是要取消3方物流
|
||||
s.CancelWaybill(bill)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}, duration, retryCount)
|
||||
@@ -250,7 +258,7 @@ func (s *DefScheduler) loadSavedOrderFromMap(status *model.OrderStatus) *WatchOr
|
||||
s.orderMap.Store(universalOrderID, realSavedInfo)
|
||||
} else {
|
||||
realSavedInfo.dirty = 0
|
||||
globals.SugarLogger.Infof("order is dirty, vendorOrderID:%s, vendorID:%d, load it", status.VendorOrderID, status.VendorID)
|
||||
globals.SugarLogger.Infof("order is dirty, orderID:%s, load it", status.VendorOrderID)
|
||||
}
|
||||
if order, err := s.CurOrderManager.LoadOrder(status.VendorOrderID, status.VendorID); err == nil {
|
||||
realSavedInfo.order = order
|
||||
@@ -264,7 +272,7 @@ func (s *DefScheduler) loadSavedOrderFromMap(status *model.OrderStatus) *WatchOr
|
||||
WaybillVendorID: model.VendorIDUnknown,
|
||||
}
|
||||
realSavedInfo.dirty = 1
|
||||
globals.SugarLogger.Infof("can not load order vendorOrderID:%s, vendorID:%d", status.VendorOrderID, status.VendorID)
|
||||
globals.SugarLogger.Infof("can not load order orderID:%s", status.VendorOrderID)
|
||||
}
|
||||
}
|
||||
return realSavedInfo
|
||||
@@ -285,13 +293,13 @@ func (s *DefScheduler) stopTimer(savedOrderInfo *WatchOrderInfo) {
|
||||
}
|
||||
|
||||
func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, status int, beginTime time.Time, gap time.Duration) {
|
||||
globals.SugarLogger.Debugf("resetTimer status:%v, orderid:%v", status, savedOrderInfo.order.VendorOrderID)
|
||||
globals.SugarLogger.Debugf("resetTimer status:%v, orderID:%s", status, savedOrderInfo.order.VendorOrderID)
|
||||
if status >= savedOrderInfo.timerStatus { // 新设置的TIMER不能覆盖状态在其后的TIMER
|
||||
s.stopTimer(savedOrderInfo)
|
||||
config := s.mergeOrderStatusConfig(status, s.GetPurchasePlatformFromVendorID(savedOrderInfo.order.VendorID).GetStatusActionConfig(status))
|
||||
if config != nil && config.TimeoutAction != nil {
|
||||
timeout := jxutils.GetRealTimeout(beginTime, config.Timeout, minTimeout) + gap
|
||||
globals.SugarLogger.Debugf("resetTimer timeout:%v, orderid:%v", timeout, savedOrderInfo.order.VendorOrderID)
|
||||
globals.SugarLogger.Debugf("resetTimer timeout:%v, orderID:%s", timeout, savedOrderInfo.order.VendorOrderID)
|
||||
savedOrderInfo.timerStatus = status
|
||||
savedOrderInfo.timer = time.AfterFunc(timeout, func() {
|
||||
config.TimeoutAction(savedOrderInfo.order)
|
||||
@@ -299,7 +307,7 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, status int, be
|
||||
})
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Infof("resetTimer status revert, orderid:%s, current timer status:%d, status:%d", savedOrderInfo.order.VendorOrderID, savedOrderInfo.timerStatus, status)
|
||||
globals.SugarLogger.Infof("resetTimer status revert, orderID:%s, current timer status:%d, status:%d", savedOrderInfo.order.VendorOrderID, savedOrderInfo.timerStatus, status)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user