diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index c780356ca..4660718ed 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -63,17 +63,20 @@ type WatchOrderInfo struct { autoPickupTimeoutMinute int // 0表示禁用,1表示用缺省值time2AutoPickupMin,其它表示分钟数 storeDeliveryType int + isDeliveryCompetition bool + pmWaybillCreatedAt time.Time + isNeedCreate3rdWaybill bool isAddWaybillTipDisabled bool - waybills map[int]*model.Waybill // 这个waybills里的状态信息是不真实的,只使用id相关的信息 + + waybills map[int]*model.Waybill // 这个waybills里的状态信息是不真实的,只使用id相关的信息 timerStatusType int // 0表示订单,1表示运单 timerStatus int timer *time.Timer timerTime time.Time - retryCount int // 失败后尝试的次数,调试阶段可能出现死循化,阻止这种情况发生 - isNeedCreate3rdWaybill bool + retryCount int // 失败后尝试的次数,调试阶段可能出现死循化,阻止这种情况发生 } type StatusActionConfig struct { @@ -347,17 +350,6 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) } } - if savedOrderInfo.order.Status == model.OrderStatusFinishedPickup { - duration := order.StatusTime.Add(minAddWaybillTipMinute * time.Minute).Sub(time.Now()) - if duration <= 0 { - duration = 1 * time.Second - } - utils.AfterFuncWithRecover(duration, func() { - jxutils.CallMsgHandlerAsync(func() { - s.handleWaybillTip(savedOrderInfo) - }, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID)) - }) - } } if order.LockStatus != model.OrderStatusUnknown { s.stopTimer(savedOrderInfo) @@ -430,6 +422,20 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo // 只有购物平台的新运单消息才会启动抢单TIMER if model.IsWaybillPlatformOwn(bill) { s.resetTimer(savedOrderInfo, bill, isPending) + isFirst := utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) + savedOrderInfo.pmWaybillCreatedAt = bill.StatusTime + savedOrderInfo.isAddWaybillTipDisabled = false + if isFirst { + duration := savedOrderInfo.pmWaybillCreatedAt.Add(minAddWaybillTipMinute * time.Minute).Sub(time.Now()) + if duration <= 0 { + duration = 1 * time.Second + } + utils.AfterFuncWithRecover(duration, func() { + jxutils.CallMsgHandlerAsync(func() { + s.handleWaybillTip(savedOrderInfo) + }, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID)) + }) + } } } else { isBillExist := s.updateBillsInfo(savedOrderInfo, bill) @@ -490,9 +496,6 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo case model.WaybillStatusAcceptCanceled: if s.isBillCandidate(order, bill) { s.resetTimer(savedOrderInfo, bill, isPending) - if model.IsWaybillPlatformOwn(bill) { - savedOrderInfo.isAddWaybillTipDisabled = false - } if !isPending { s.updateOrderByBill(order, nil, true) } @@ -612,7 +615,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { if savedOrderInfo.retryCount <= maxWaybillRetryCount { savedOrderInfo.isNeedCreate3rdWaybill = true - if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, false, 1000, 1000, s.getMaxDeliveryFee(order)); err == nil { + if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, false, 1000, 1000, s.getMaxDeliveryFee(savedOrderInfo)); err == nil { savedOrderInfo.retryCount++ } } else { @@ -985,32 +988,28 @@ func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error return err } -func (s *DefScheduler) getWaybillTip(order *model.GoodsOrder) (tipFee int64) { - if order.Status == model.OrderStatusFinishedPickup { - statusTime := order.StatusTime - if order.BusinessType != model.BusinessTypeImmediate { - statusTime = order.PickDeadline - } - if !utils.IsTimeZero(statusTime) { - startTime := order.StatusTime.Add(minAddWaybillTipMinute * time.Minute) - if order.DeliveryFlag&model.OrderDeliveryFlagMaskAutoPickup != 0 { - startTime = startTime.Add(5 * time.Minute) - } - timeGap1 := time.Now().Sub(startTime) - if timeGap1 > 0 { - timeGap := int64(timeGap1/(addWaybillTipGap*time.Minute)) + 1 - tipFee = timeGap * 100 - if tipFee > 600 { - tipFee = 600 - } +func (s *DefScheduler) getWaybillTip(savedOrderInfo *WatchOrderInfo) (tipFee int64) { + order := savedOrderInfo.order + if order.Status == model.OrderStatusFinishedPickup && + !utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) { + startTime := savedOrderInfo.pmWaybillCreatedAt.Add(minAddWaybillTipMinute * time.Minute) + // if order.DeliveryFlag&model.OrderDeliveryFlagMaskAutoPickup != 0 { + // startTime = startTime.Add(5 * time.Minute) + // } + timeGap1 := time.Now().Sub(startTime) + if timeGap1 > 0 { + timeGap := int64(timeGap1/(addWaybillTipGap*time.Minute)) + 1 + tipFee = timeGap * 100 + if tipFee > 600 { + tipFee = 600 } } } return tipFee } -func (s *DefScheduler) getMaxDeliveryFee(order *model.GoodsOrder) (maxDeliveryFee int64) { - maxDeliveryFee = 400 + order.DistanceFreightMoney + s.getWaybillTip(order) +func (s *DefScheduler) getMaxDeliveryFee(savedOrderInfo *WatchOrderInfo) (maxDeliveryFee int64) { + maxDeliveryFee = 400 + savedOrderInfo.order.DistanceFreightMoney + s.getWaybillTip(savedOrderInfo) return maxDeliveryFee } @@ -1019,11 +1018,12 @@ func (s *DefScheduler) handleWaybillTip(savedOrderInfo *WatchOrderInfo) { savedOrderInfo.isDeliveryCompetition { order2 := savedOrderInfo.order if order, err := partner.CurOrderManager.LoadOrder(order2.VendorOrderID, order2.VendorID); err == nil { + savedOrderInfo.SetOrder(order) if order.Status == model.OrderStatusFinishedPickup && - order.DeliveryFlag&model.OrderDeliveryFlagMaskScheduleDisabled == 0 && - order.BusinessType == model.BusinessTypeImmediate { - if !savedOrderInfo.isAddWaybillTipDisabled { - if tipFee := s.getWaybillTip(order); tipFee > 0 { + order.DeliveryFlag&model.OrderDeliveryFlagMaskScheduleDisabled == 0 { + if !utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) && + !savedOrderInfo.isAddWaybillTipDisabled { + if tipFee := s.getWaybillTip(savedOrderInfo); tipFee > 0 { if handler, ok := partner.GetPurchasePlatformFromVendorID(order.VendorID).(partner.IUpdateWaybillTip); ok && handler != nil { err := handler.UpdateWaybillTip(jxcontext.AdminCtx, order, tipFee) vendorStatus := fmt.Sprintf("添加小费:%s", jxutils.IntPrice2StandardCurrencyString(tipFee))