@@ -69,9 +69,8 @@ type WatchOrderInfo struct {
storeDeliveryType int
isDeliveryCompetition bool
pmWaybillCreatedAt time . Time
isNeedCreate3rdWaybill bool
isAdd Way billTipDisabled bool
watch WabillStartAt * time . Time
waybills map [ int ] * model . Waybill // 这个waybills里的状态信息是不真实的, 只使用id相关的信息
@@ -224,6 +223,8 @@ func init() {
} ,
TimeoutAction : func ( savedOrderInfo * WatchOrderInfo , bill * model . Waybill ) ( err error ) {
if savedOrderInfo . storeDeliveryType == scheduler . StoreDeliveryTypeByStore && savedOrderInfo . order . DeliveryType != model . OrderDeliveryTypeSelfTake { // 自配送商家使用
// 启动抢单TIMER
sch . saveDeliveryFeeFromAndStartWatch ( savedOrderInfo , savedOrderInfo . order . StatusTime )
return sch . createWaybillOn3rdProviders ( savedOrderInfo , 0 , nil )
}
return nil
@@ -431,23 +432,10 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
err = partner . CurOrderManager . UpdateOrderStatusAndDeliveryFlag ( order )
}
}
// 只有 购物平台的新运单消息才 会启动抢单TIMER
// 购物平台的新运单消息会启动抢单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 ) )
} )
}
s . saveDeliveryFeeFromAndStartWatch ( savedOrderInfo , bill . StatusTime )
}
} else {
isBillExist := s . updateBillsInfo ( savedOrderInfo , bill )
@@ -471,7 +459,6 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s . cancelOtherWaybillsCheckOrderDeliveryFlag ( savedOrderInfo , bill , partner . CancelWaybillReasonNotAcceptIntime , partner . CancelWaybillReasonStrNotAcceptIntime )
if model . IsWaybillPlatformOwn ( bill ) {
savedOrderInfo . isAddWaybillTipDisabled = true
if bill . Status == model . WaybillStatusDelivering {
// 强制将订单状态置为配送中?
order . Status = model . OrderStatusDelivering
@@ -619,7 +606,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
return nil
}
if maxDeliveryFee == 0 {
maxDeliveryFee = s . getMaxDeliveryFee ( savedOrderInfo )
maxDeliveryFee = getMaxDeliveryFee ( order )
}
if err = s . canOrderCreateWaybillNormally ( order ) ; err == nil {
if ( order . DeliveryFlag & model . OrderDeliveryFlagMaskScheduleDisabled ) == 0 {
@@ -1001,14 +988,9 @@ func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error
return err
}
func ( s * DefScheduler ) getWaybillTip ( savedOrderInfo * Watch OrderInfo ) ( 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)
// }
func getWaybillTip ( order * model . Goods Order) ( tipFee int64 ) {
if ! utils . IsPtrTimeZero ( order . DeliveryFeeFrom ) {
startTime := order . DeliveryFeeFrom . Add ( minAddWaybillTipMinute * time . Minute )
timeGap1 := time . Now ( ) . Sub ( startTime )
if timeGap1 > 0 {
timeGap := int64 ( timeGap1 / ( addWaybillTipGap * time . Minute ) ) + 1
@@ -1021,24 +1003,59 @@ func (s *DefScheduler) getWaybillTip(savedOrderInfo *WatchOrderInfo) (tipFee int
return tipFee
}
func ( s * DefScheduler ) getMaxDeliveryFee ( savedOrderInfo * Watch OrderInfo ) ( maxDeliveryFee int64 ) {
maxDeliveryFee = baseWaybillFee + savedOrderInfo . order. DistanceFreightMoney + s . getWaybillTip ( savedOrderInfo )
func getMaxDeliveryFee ( order * model . Goods Order) ( maxDeliveryFee int64 ) {
maxDeliveryFee = baseWaybillFee + order . DistanceFreightMoney + getWaybillTip ( order )
return maxDeliveryFee
}
func ( s * DefScheduler ) handleWaybillTip ( savedOrderInfo * WatchOrderInfo ) {
if savedOrderInfo . storeDeliveryType != scheduler . StoreDeliveryTypeByStore &&
savedOrderInfo . isDeliveryCompetition {
func isNeedWatchWaybillTip ( order * model . GoodsOrder ) bool {
return order . DeliveryFlag & model . OrderDeliveryFlagMaskPurcahseDisabled == 0 && // 没有转出
order . DeliveryType == model . OrderDeliveryTypePlatform && // 订单配送类型为平台
! utils . IsPtrTimeZero ( order . DeliveryFeeFrom ) // 已经有了开始计费时间
}
func isNeedWatch3rdWaybill ( order * model . GoodsOrder ) bool {
return ( order . Status >= model . OrderStatusFinishedPickup && order . Status < model . OrderStatusDelivering ) && // 订单状态
order . DeliveryFlag & model . OrderDeliveryFlagMaskScheduleDisabled == 0 && // 没有禁止调度
! model . IsOrderHaveWaybill ( order ) // 没有有效运单
}
func ( s * DefScheduler ) setWatchOrderWaybills ( savedOrderInfo * WatchOrderInfo , duration time . Duration ) {
if utils . IsPtrTimeZero ( savedOrderInfo . watchWabillStartAt ) {
savedOrderInfo . watchWabillStartAt = utils . Time2Pointer ( time . Now ( ) )
utils . AfterFuncWithRecover ( 5 * time . Minute , func ( ) {
jxutils . CallMsgHandlerAsync ( func ( ) {
savedOrderInfo . watchWabillStartAt = nil
s . watchOrderWaybills ( savedOrderInfo )
} , jxutils . ComposeUniversalOrderID ( savedOrderInfo . order . VendorOrderID , savedOrderInfo . order . VendorID ) )
} )
}
}
func ( s * DefScheduler ) saveDeliveryFeeFromAndStartWatch ( savedOrderInfo * WatchOrderInfo , statusTime time . Time ) {
order := savedOrderInfo . order
if utils . IsPtrTimeZero ( order . DeliveryFeeFrom ) {
order . DeliveryFeeFrom = utils . Time2Pointer ( statusTime )
partner . CurOrderManager . UpdateOrderFields ( order , [ ] string { "DeliveryFeeFrom" } )
}
duration := order . DeliveryFeeFrom . Add ( minAddWaybillTipMinute * time . Minute ) . Sub ( time . Now ( ) )
if duration <= 0 {
duration = 5 * time . Second
}
s . setWatchOrderWaybills ( savedOrderInfo , duration )
}
func ( s * DefScheduler ) watchOrderWaybills ( savedOrderInfo * WatchOrderInfo ) {
if savedOrderInfo . storeDeliveryType != scheduler . StoreDeliveryTypeByStore && savedOrderInfo . isDeliveryCompetition ||
savedOrderInfo . storeDeliveryType == scheduler . StoreDeliveryTypeByStore {
order2 := savedOrderInfo . order
if order , err := partner . CurOrderManager . LoadOrder ( order2 . VendorOrderID , order2 . VendorID ) ; err == nil {
savedOrderInfo . SetOrder ( order )
if order . Status == mode l. O rderStatusFinishedPickup &&
order . DeliveryFlag & model . O rderDeliveryFlagMaskScheduleDisabled == 0 {
if ! utils . IsTimeZero ( savedOrderInfo . pmWaybillCreatedAt ) &&
! savedOrderInfo . isAddWaybillTipDisabled {
if tipFee := s . getWaybillTip ( savedOrderInfo ) ; tipFee > 0 {
if isNeedWatch3rdWaybil l( o rder) {
if isNeedWatchWaybillTip ( o rder) {
if handler , ok := partner . GetPurchaseOrderHandlerFromVendorID ( order . VendorID ) . ( partner . IAddWaybillTip ) ; ok && handler != nil {
var remark string
tipFee := getWaybillTip ( order )
vendorStatus := fmt . Sprintf ( "设置小费:%s" , jxutils . IntPrice2StandardCurrencyString ( tipFee ) )
if curTipFee , err := handler . GetWaybillTip ( jxcontext . AdminCtx , order ) ; err == nil {
tipFee2Add := tipFee - curTipFee
@@ -1062,16 +1079,11 @@ func (s *DefScheduler) handleWaybillTip(savedOrderInfo *WatchOrderInfo) {
}
partner . CurOrderManager . OnOrderMsg ( order , vendorStatus , remark )
}
}
if savedOrderInfo . isNeedCreate3rdWaybill {
s . createWaybillOn3rdProviders ( savedOrderInfo , 0 , nil )
}
}
}
utils . AfterFuncWithRecover ( 5 * time . Minute , func ( ) {
jxutils . CallMsgHandlerAsync ( func ( ) {
s . handleWaybillTip ( savedOrderInfo )
} , jxutils . ComposeUniversalOrderID ( order . VendorOrderID , order . VendorID ) )
} )
s . setWatchOrderWaybills ( savedOrderInfo , 5 * time . Minute )
}
}
}