@@ -55,9 +55,10 @@ var (
)
type WatchOrderInfo struct {
order * model . GoodsOrder // order里的信息是保持更新的
autoPickupTimeoutMinute int // 0表示禁用, 1表示用缺省值time2AutoPickupMin, 其它表示分钟数
storeDeliveryType int
order * model . GoodsOrder // order里的信息是保持更新的
waybills map [ int ] * model . Waybill // 这个waybills里的状态信息是不真实的, 只使用id相关的信息
timerStatusType int // 0表示订单, 1表示运单
@@ -112,10 +113,10 @@ func (s *WatchOrderInfo) updateOrderStoreFeature(order *model.GoodsOrder) (err e
}
s . autoPickupTimeoutMinute = int ( storeMap . AutoPickup )
s . storeDeliveryType = FixedScheduler . GetStoreDeliveryType ( order , storeMap )
if s . storeDeliveryType == scheduler . StoreDeliveryTypeByStore {
if s . storeDeliveryType == scheduler . StoreDeliveryTypeByStore && ( order . DeliveryFlag & model . OrderDeliveryFlagMaskPurcahseDisabled ) == 0 {
order . DeliveryFlag |= model . OrderDeliveryFlagMaskPurcahseDisabled
err = partner . CurOrderManager . UpdateOrderStatusAndFlag ( order )
}
_ , err = dao . UpdateEntity ( db , order , "DeliveryFlag" )
globals . SugarLogger . Debugf ( "updateOrderStoreFeature orderID:%s, s.storeDeliveryType:%d, order.DeliveryFlag:%d" , order . VendorOrderID , s . storeDeliveryType , order . DeliveryFlag )
}
return err
@@ -221,12 +222,7 @@ func Init() {
func ( s * DefScheduler ) OnOrderNew ( order * model . GoodsOrder , isPending bool ) ( err error ) {
globals . SugarLogger . Debugf ( "OnOrderNew orderID:%s" , order . VendorOrderID )
savedOrderInfo := s . loadSavedOrderFromMap ( model . Order2Status ( order ) , false )
if savedOrderInfo == nil {
savedOrderInfo = NewWatchOrderInfo ( order )
s . orderMap . StoreWithTimeout ( jxutils . ComposeUniversalOrderID ( order . VendorOrderID , order . VendorID ) , savedOrderInfo , orderMapStoreMaxTime )
} else {
savedOrderInfo . SetOrder ( order ) // 调整单或消息错序都可能进到这里来
}
savedOrderInfo . SetOrder ( order )
if order . Status >= model . OrderStatusNew {
s . resetTimer ( savedOrderInfo , nil , isPending )
if ! isPending && order . Status >= model . OrderStatusAccepted { // 有订单消息错序, 先收到接单消息, 再收到新订单消息, 导致接单TIMER不动作, 这里补一下
@@ -242,13 +238,15 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err
// todo 这个接口应该可以直接传order的, 因为在OrderManager中每次都生成了
func ( s * DefScheduler ) OnOrderStatusChanged ( order * model . GoodsOrder , status * model . OrderStatus , isPending bool ) ( err error ) {
if order == nil && ( status. Status != model . OrderStatusUnknown && status . Status != model . OrderStatusMsg ) {
globals . SugarLogger . Warnf ( "OnOrderStatusChanged order is nil, status:%s" , utils . Format4Output ( status , true ) )
}
if status . LockStatus != model . OrderStatusUnknown || ( status . Status > model . OrderStatusMsg && status . Status != model . OrderStatusUnknown ) {
if status . Status > model . OrderStatusMsg && status . Status != model . OrderStatusUnknown {
globals . SugarLogger . Debugf ( "OnOrderStatusChanged orderID:%s %s, status:%v" , status . VendorOrderID , model . OrderStatusName [ status . Status ] , status )
savedOrderInfo : = s . loadSavedOrderFromMap ( status , true )
s . update OrderBy Status( savedOrderInfo . order , status )
if order = = nil {
globals . SugarLogger . Warnf ( "On OrderStatusChanged order is nil, status:%s" , utils . Format4Output ( status , true ) )
}
savedOrderInfo := s . loadSavedOrderFromMap ( status , false )
savedOrderInfo . SetOrder ( order )
// s.updateOrderByStatus(savedOrderInfo.order, status)
// if status.Status == model.OrderStatusNew {
// if !isPending {
// utils.CallFuncAsync(func() {
@@ -256,7 +254,11 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod
// })
// }
// }
if status . LockStatus == model . OrderStatusUnknown && status . Status > model . OrderStatusUnknown { // 只处理状态转换,一般消息不处理
if order . LockStatus == model . OrderStatusUnknown && ( status . Status > model . OrderStatusUnknown || status . Status == model . OrderStatusRefuseFailedGetGoods ) { // 只处理状态转换,一般消息不处理
if status . Status == model . OrderStatusRefuseFailedGetGoods && order . Status != model . OrderStatusFinishedPickup && ! model . IsOrderFinalStatus ( order . Status ) {
order . Status = model . OrderStatusFinishedPickup
partner . CurOrderManager . UpdateOrderStatusAndFlag ( order )
}
s . resetTimer ( savedOrderInfo , nil , isPending )
if status . Status >= model . OrderStatusDelivering {
// 会出现创建运单后, 门店自己转自送了( 例如: 828400083000222) , 当前逻辑会导致此运单不会被取消, 有三个可能的修改方法, 考虑1:
@@ -276,17 +278,16 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod
if status . Status >= model . OrderStatusEndBegin {
s . orderMap . Delete ( jxutils . GetUniversalOrderIDFromOrderStatus ( status ) )
}
} else if status . Status == model . OrderStatusRefuseFailedGetGoods {
// 将order状态设置为OrderStatusFinishedPickup
}
}
if status . LockStatus != model . OrderStatusUnknown {
if order . LockStatus != model . OrderStatusUnknown {
s . stopTimer ( savedOrderInfo )
}
if model . IsOrderLockStatus ( status . Status ) ||
model . IsOrderUnlockStatus ( status . Status ) ||
status . Status == model . OrderStatusApplyFailedGetGoods ||
status . Status == model . OrderStatusAgreeFailedGetGoods {
status . Status == model . OrderStatusAgreeFailedGetGoods ||
status . Status == model . OrderStatusDeliverFailed {
if isPending {
if status . Status == model . OrderStatusApplyCancel {
utils . CallFuncAsync ( func ( ) {
@@ -592,7 +593,6 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf
}
} else {
s . removeWaybillFromMap ( savedOrderInfo , order . VendorID )
partner . CurOrderManager . UpdateOrderStatusAndFlag ( order )
}
} else {
// 进到这里的原因是,在这个时间点,购物平台物流已经抢单(但抢单消息还没有被收到),所以转自送会失败 ( 比如: 818810379000941) , 更好的做法应该是判断Swtich2SelfDeliver的返回值, 这种情况下就不得试了
@@ -603,20 +603,17 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf
}
// 这个函数这样写的原因是适应一些消息错序
func ( s * DefScheduler ) loadSavedOrderFromMap ( status * model . OrderStatus , isAuto Load bool ) * WatchOrderInfo {
func ( s * DefScheduler ) loadSavedOrderFromMap ( status * model . OrderStatus , isForce Load bool ) * WatchOrderInfo {
globals . SugarLogger . Debugf ( "loadSavedOrderFromMap status:%v" , status )
universalOrderID := jxutils . ComposeUniversalOrderID ( status . RefVendorOrderID , status . RefVendorID )
var realSavedInfo * WatchOrderInfo
if savedInfo , ok := s . orderMap . Load ( universalOrderID ) ; ok {
realSavedInfo = savedInfo . ( * WatchOrderInfo )
} else {
realSavedInfo = NewWatchOrderInfo ( nil )
s . orderMap . StoreWithTimeout ( universalOrderID , realSavedInfo , orderMapStoreMaxTime )
}
if isAutoLoad && ( realSavedInfo == nil || ! model . IsOrderSolid ( realSavedInfo . order ) ) {
if realSavedInfo == nil {
realSavedInfo = NewWatchOrderInfo ( nil )
s . orderMap . StoreWithTimeout ( universalOrderID , realSavedInfo , orderMapStoreMaxTime )
} else {
globals . SugarLogger . Infof ( "loadSavedOrderFromMap order is incomplete, orderID:%s, load it" , status . RefVendorOrderID )
}
if isForceLoad {
if order , err := partner . CurOrderManager . LoadOrder ( status . RefVendorOrderID , status . RefVendorID ) ; err == nil {
realSavedInfo . SetOrder ( order )
} else {
@@ -684,6 +681,7 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, bill *model.Wa
savedOrderInfo . timer = utils . AfterFuncWithRecover ( timeout , func ( ) {
jxutils . CallMsgHandlerAsync ( func ( ) {
globals . SugarLogger . Debugf ( "fire timer:%s, orderID:%s" , timerName , order . VendorOrderID )
savedOrderInfo := s . loadSavedOrderFromMap ( model . Order2Status ( order ) , true )
config . TimeoutAction ( savedOrderInfo )
savedOrderInfo . timerStatus = 0
savedOrderInfo . timerStatusType = scheduler . TimerStatusTypeUnknown
@@ -808,13 +806,13 @@ func (s *DefScheduler) handleAutoAcceptOrder(orderID string, vendorID int, userM
return handleType
}
func ( s * DefScheduler) updateOrderByStatus( order * model . GoodsOrder , status * model . OrderStatus ) ( retVal * model . GoodsOrder) {
order . Status = status. Status
order . VendorStatus = status. VendorStatus
order . StatusTime = status. StatusTime
order . LockStatus = status. LockStatus
return order
}
// func (s * DefScheduler) updateOrderByStatus(order *model.GoodsOrder, status *model.OrderStatus) (retVal *model. GoodsOrder) {
// order.Status = status. Status
// order. VendorStatus = status. VendorStatus
// order.StatusTime = status. StatusTime
// order.LockStatus = status. LockStatus
// return order
// }
func ( s * DefScheduler ) updateOrderByBill ( order * model . GoodsOrder , bill * model . Waybill , revertStatus bool ) {
if order . Status > model . OrderStatusEndBegin {
@@ -828,6 +826,7 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa
order . VendorWaybillID = bill . VendorWaybillID
if revertStatus {
order . Status = model . OrderStatusFinishedPickup
partner . CurOrderManager . UpdateOrderStatusAndFlag ( order )
}
}