diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index f6a15b2ed..884dfbc32 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -38,6 +38,7 @@ const ( orderMapStoreMaxTime = 4 * 24 * time.Hour // cache最长存储时间 time2Schedule3rdCarrierKey = "waitminute4mt" + dingShiDaAheadTime = 30 * time.Minute // 定时达订单开始召唤配送的提前时间 ) const ( @@ -694,7 +695,7 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, bill *model.Wa } globals.SugarLogger.Debugf("resetTimer, orderID:%s statusType:%d status:%v", order.VendorOrderID, statusType, status) if statusType != savedOrderInfo.timerStatusType || status >= savedOrderInfo.timerStatus { // 新设置的TIMER不能覆盖状态在其后的TIMER,如果状态回绕,需要注意 - config := s.mergeOrderStatusConfig(statusType, status, order.VendorID) + config := s.mergeOrderStatusConfig(savedOrderInfo.order, statusType, status, order.VendorID) if config == nil || config.TimerType != scheduler.TimerTypeByPass { s.stopTimer(savedOrderInfo) } @@ -791,7 +792,7 @@ func (s *DefScheduler) handleAutoAcceptOrder(orderID string, vendorID int, userM return handleType } -func (s *DefScheduler) mergeOrderStatusConfig(statusType, status int, purchaseVendorID int) (retVal *StatusActionConfig) { +func (s *DefScheduler) mergeOrderStatusConfig(order *model.GoodsOrder, statusType, status int, purchaseVendorID int) (retVal *StatusActionConfig) { s.locker.RLock() defer func() { s.locker.RUnlock() @@ -802,7 +803,14 @@ func (s *DefScheduler) mergeOrderStatusConfig(statusType, status int, purchaseVe } retVal = &StatusActionConfig{} *retVal = *defConfig - if vendorActionParams := partner.GetPurchasePlatformFromVendorID(purchaseVendorID).GetStatusActionTimeout(statusType, status); vendorActionParams != nil { + + if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusFinishedPickup && order.BusinessType != model.BusinessTypeImmediate { + if jxutils.IsTimeEmpty(order.ExpectedDeliveredTime) { + globals.SugarLogger.Warnf("mergeOrderStatusConfig orderID:%s 非立即达订单没有预计送达时间", order.VendorOrderID) + } else { + retVal.Timeout = order.ExpectedDeliveredTime.Sub(time.Now()) - dingShiDaAheadTime + } + } else if vendorActionParams := partner.GetPurchasePlatformFromVendorID(purchaseVendorID).GetStatusActionTimeout(order, statusType, status); vendorActionParams != nil { retVal.Timeout = vendorActionParams.Timeout if vendorActionParams.TimeoutGap >= 0 { retVal.TimeoutGap = vendorActionParams.TimeoutGap diff --git a/business/partner/partner.go b/business/partner/partner.go index 06376a7be..95d2c9bda 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -74,7 +74,7 @@ type IPurchasePlatformHandler interface { GetStatusFromVendorStatus(vendorStatus string) int Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) - GetStatusActionTimeout(statusType, status int) (params *StatusActionParams) + GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *StatusActionParams) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) PickupGoods(order *model.GoodsOrder, isSelfDeilivery bool, userName string) (err error) @@ -152,7 +152,7 @@ type DeliveryPlatformHandlerInfo struct { type BasePurchasePlatform struct { } -func (p *BasePurchasePlatform) GetStatusActionTimeout(statusType, status int) (params *StatusActionParams) { +func (p *BasePurchasePlatform) GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *StatusActionParams) { return params } diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 610391b68..d4fb73119 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -105,6 +105,9 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo order.BusinessType = model.BusinessTypeImmediate } else { order.BusinessType = model.BusinessTypeDingshida + if jxutils.IsTimeEmpty(order.ExpectedDeliveredTime) { + order.ExpectedDeliveredTime = getTimeFromInterface(orderMap["latest_send_time"]) + } } deliveryGeo := userMap["coord"].(map[string]interface{}) @@ -272,7 +275,7 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta return orderStatus } -func (c *PurchaseHandler) GetStatusActionTimeout(statusType, status int) (params *partner.StatusActionParams) { +func (c *PurchaseHandler) GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *partner.StatusActionParams) { if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusAccepted { params = &partner.StatusActionParams{ // 饿百要求在5分钟内拣货,不然订单会被取消 Timeout: pickupOrderDelay, diff --git a/business/partner/purchase/elm/order.go b/business/partner/purchase/elm/order.go index 77432d8b2..d402ddacd 100644 --- a/business/partner/purchase/elm/order.go +++ b/business/partner/purchase/elm/order.go @@ -317,7 +317,7 @@ func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName return err } -func (c *PurchaseHandler) GetStatusActionTimeout(statusType, status int) (params *partner.StatusActionParams) { +func (c *PurchaseHandler) GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *partner.StatusActionParams) { if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusNew { params = &partner.StatusActionParams{ // 饿了么开了专送店的订单没有拣货状态,接单后就为拣货完成,所以要延迟接单,否则门店来不及备货 Timeout: acceptOrderDelay, diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 43ecb53dc..b73e9fa4e 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -65,7 +65,6 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) { result := orderData vendorOrderID := utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"])) - deliveryTime := utils.Interface2Int64WithDefault(result["delivery_time"], 0) // 因为美团外卖不能自动设置商家门店号,且只能通过商家门店号来访问门店, // 为了在后台设置简单一致,把app_poi_code直接当成平台门店号使用(即在后台设置时,平台门店号与商家门店号一样) // 订单中wm_poi_id实际来平台门店号,app_poi_code为商家门店号,这样一来,这两个就相同了 @@ -83,7 +82,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo ConsigneeAddress: result["recipient_address"].(string), CoordinateType: model.CoordinateTypeMars, BuyerComment: utils.TrimBlankChar(utils.Interface2String(result["caution"])), - ExpectedDeliveredTime: getTimeFromTimestamp(deliveryTime), + ExpectedDeliveredTime: getTimeFromTimestamp(utils.Interface2Int64WithDefault(result["delivery_time"], 0)), PickDeadline: utils.DefaultTimeValue, VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["status"])), OrderSeq: int(utils.MustInterface2Int64(result["day_seq"])), @@ -93,7 +92,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo Skus: []*model.OrderSku{}, } order.Status = p.GetStatusFromVendorStatus(order.VendorStatus) - if deliveryTime == 0 { + if jxutils.IsTimeEmpty(order.ExpectedDeliveredTime) { order.BusinessType = model.BusinessTypeImmediate } else { order.BusinessType = model.BusinessTypeDingshida @@ -277,7 +276,7 @@ func (c *PurchaseHandler) RefreshRealMobile(ctx *jxcontext.Context, fromTime, to return hint, err } -func (c *PurchaseHandler) GetStatusActionTimeout(statusType, status int) (params *partner.StatusActionParams) { +func (c *PurchaseHandler) GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *partner.StatusActionParams) { if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusAccepted { params = &partner.StatusActionParams{ // 美团外卖要求在5分钟内拣货,不然订单会被取消 Timeout: pickupOrderDelay,