- 处理自配送门店非立即达订单的发运单时间问题
This commit is contained in:
@@ -38,6 +38,7 @@ const (
|
|||||||
orderMapStoreMaxTime = 4 * 24 * time.Hour // cache最长存储时间
|
orderMapStoreMaxTime = 4 * 24 * time.Hour // cache最长存储时间
|
||||||
|
|
||||||
time2Schedule3rdCarrierKey = "waitminute4mt"
|
time2Schedule3rdCarrierKey = "waitminute4mt"
|
||||||
|
dingShiDaAheadTime = 30 * time.Minute // 定时达订单开始召唤配送的提前时间
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
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)
|
globals.SugarLogger.Debugf("resetTimer, orderID:%s statusType:%d status:%v", order.VendorOrderID, statusType, status)
|
||||||
if statusType != savedOrderInfo.timerStatusType || status >= savedOrderInfo.timerStatus { // 新设置的TIMER不能覆盖状态在其后的TIMER,如果状态回绕,需要注意
|
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 {
|
if config == nil || config.TimerType != scheduler.TimerTypeByPass {
|
||||||
s.stopTimer(savedOrderInfo)
|
s.stopTimer(savedOrderInfo)
|
||||||
}
|
}
|
||||||
@@ -791,7 +792,7 @@ func (s *DefScheduler) handleAutoAcceptOrder(orderID string, vendorID int, userM
|
|||||||
return handleType
|
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()
|
s.locker.RLock()
|
||||||
defer func() {
|
defer func() {
|
||||||
s.locker.RUnlock()
|
s.locker.RUnlock()
|
||||||
@@ -802,7 +803,14 @@ func (s *DefScheduler) mergeOrderStatusConfig(statusType, status int, purchaseVe
|
|||||||
}
|
}
|
||||||
retVal = &StatusActionConfig{}
|
retVal = &StatusActionConfig{}
|
||||||
*retVal = *defConfig
|
*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
|
retVal.Timeout = vendorActionParams.Timeout
|
||||||
if vendorActionParams.TimeoutGap >= 0 {
|
if vendorActionParams.TimeoutGap >= 0 {
|
||||||
retVal.TimeoutGap = vendorActionParams.TimeoutGap
|
retVal.TimeoutGap = vendorActionParams.TimeoutGap
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ type IPurchasePlatformHandler interface {
|
|||||||
GetStatusFromVendorStatus(vendorStatus string) int
|
GetStatusFromVendorStatus(vendorStatus string) int
|
||||||
Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder)
|
Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder)
|
||||||
GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error)
|
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)
|
AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error)
|
||||||
PickupGoods(order *model.GoodsOrder, isSelfDeilivery 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 {
|
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
|
return params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
|||||||
order.BusinessType = model.BusinessTypeImmediate
|
order.BusinessType = model.BusinessTypeImmediate
|
||||||
} else {
|
} else {
|
||||||
order.BusinessType = model.BusinessTypeDingshida
|
order.BusinessType = model.BusinessTypeDingshida
|
||||||
|
if jxutils.IsTimeEmpty(order.ExpectedDeliveredTime) {
|
||||||
|
order.ExpectedDeliveredTime = getTimeFromInterface(orderMap["latest_send_time"])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deliveryGeo := userMap["coord"].(map[string]interface{})
|
deliveryGeo := userMap["coord"].(map[string]interface{})
|
||||||
@@ -272,7 +275,7 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta
|
|||||||
return orderStatus
|
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 {
|
if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusAccepted {
|
||||||
params = &partner.StatusActionParams{ // 饿百要求在5分钟内拣货,不然订单会被取消
|
params = &partner.StatusActionParams{ // 饿百要求在5分钟内拣货,不然订单会被取消
|
||||||
Timeout: pickupOrderDelay,
|
Timeout: pickupOrderDelay,
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName
|
|||||||
return err
|
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 {
|
if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusNew {
|
||||||
params = &partner.StatusActionParams{ // 饿了么开了专送店的订单没有拣货状态,接单后就为拣货完成,所以要延迟接单,否则门店来不及备货
|
params = &partner.StatusActionParams{ // 饿了么开了专送店的订单没有拣货状态,接单后就为拣货完成,所以要延迟接单,否则门店来不及备货
|
||||||
Timeout: acceptOrderDelay,
|
Timeout: acceptOrderDelay,
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
|
|||||||
func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
||||||
result := orderData
|
result := orderData
|
||||||
vendorOrderID := utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"]))
|
vendorOrderID := utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"]))
|
||||||
deliveryTime := utils.Interface2Int64WithDefault(result["delivery_time"], 0)
|
|
||||||
// 因为美团外卖不能自动设置商家门店号,且只能通过商家门店号来访问门店,
|
// 因为美团外卖不能自动设置商家门店号,且只能通过商家门店号来访问门店,
|
||||||
// 为了在后台设置简单一致,把app_poi_code直接当成平台门店号使用(即在后台设置时,平台门店号与商家门店号一样)
|
// 为了在后台设置简单一致,把app_poi_code直接当成平台门店号使用(即在后台设置时,平台门店号与商家门店号一样)
|
||||||
// 订单中wm_poi_id实际来平台门店号,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),
|
ConsigneeAddress: result["recipient_address"].(string),
|
||||||
CoordinateType: model.CoordinateTypeMars,
|
CoordinateType: model.CoordinateTypeMars,
|
||||||
BuyerComment: utils.TrimBlankChar(utils.Interface2String(result["caution"])),
|
BuyerComment: utils.TrimBlankChar(utils.Interface2String(result["caution"])),
|
||||||
ExpectedDeliveredTime: getTimeFromTimestamp(deliveryTime),
|
ExpectedDeliveredTime: getTimeFromTimestamp(utils.Interface2Int64WithDefault(result["delivery_time"], 0)),
|
||||||
PickDeadline: utils.DefaultTimeValue,
|
PickDeadline: utils.DefaultTimeValue,
|
||||||
VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["status"])),
|
VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["status"])),
|
||||||
OrderSeq: int(utils.MustInterface2Int64(result["day_seq"])),
|
OrderSeq: int(utils.MustInterface2Int64(result["day_seq"])),
|
||||||
@@ -93,7 +92,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
|||||||
Skus: []*model.OrderSku{},
|
Skus: []*model.OrderSku{},
|
||||||
}
|
}
|
||||||
order.Status = p.GetStatusFromVendorStatus(order.VendorStatus)
|
order.Status = p.GetStatusFromVendorStatus(order.VendorStatus)
|
||||||
if deliveryTime == 0 {
|
if jxutils.IsTimeEmpty(order.ExpectedDeliveredTime) {
|
||||||
order.BusinessType = model.BusinessTypeImmediate
|
order.BusinessType = model.BusinessTypeImmediate
|
||||||
} else {
|
} else {
|
||||||
order.BusinessType = model.BusinessTypeDingshida
|
order.BusinessType = model.BusinessTypeDingshida
|
||||||
@@ -277,7 +276,7 @@ func (c *PurchaseHandler) RefreshRealMobile(ctx *jxcontext.Context, fromTime, to
|
|||||||
return hint, err
|
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 {
|
if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusAccepted {
|
||||||
params = &partner.StatusActionParams{ // 美团外卖要求在5分钟内拣货,不然订单会被取消
|
params = &partner.StatusActionParams{ // 美团外卖要求在5分钟内拣货,不然订单会被取消
|
||||||
Timeout: pickupOrderDelay,
|
Timeout: pickupOrderDelay,
|
||||||
|
|||||||
Reference in New Issue
Block a user