添加GoodsOrder.DeliveryFeeFrom表示三方运单计算参考起始时间

重构平台添加小费及三方配送召唤逻辑
This commit is contained in:
gazebo
2019-09-29 17:08:03 +08:00
parent 601db3f0ce
commit de9bebf958
2 changed files with 129 additions and 116 deletions

View File

@@ -68,10 +68,9 @@ type WatchOrderInfo struct {
autoPickupTimeoutMinute int // 0表示禁用1表示用缺省值time2AutoPickupMin其它表示分钟数
storeDeliveryType int
isDeliveryCompetition bool
pmWaybillCreatedAt time.Time
isNeedCreate3rdWaybill bool
isAddWaybillTipDisabled bool
isDeliveryCompetition bool
isNeedCreate3rdWaybill bool
watchWabillStartAt *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 *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)
// }
func getWaybillTip(order *model.GoodsOrder) (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,57 +1003,87 @@ func (s *DefScheduler) getWaybillTip(savedOrderInfo *WatchOrderInfo) (tipFee int
return tipFee
}
func (s *DefScheduler) getMaxDeliveryFee(savedOrderInfo *WatchOrderInfo) (maxDeliveryFee int64) {
maxDeliveryFee = baseWaybillFee + savedOrderInfo.order.DistanceFreightMoney + s.getWaybillTip(savedOrderInfo)
func getMaxDeliveryFee(order *model.GoodsOrder) (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 == model.OrderStatusFinishedPickup &&
order.DeliveryFlag&model.OrderDeliveryFlagMaskScheduleDisabled == 0 {
if !utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) &&
!savedOrderInfo.isAddWaybillTipDisabled {
if tipFee := s.getWaybillTip(savedOrderInfo); tipFee > 0 {
if handler, ok := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).(partner.IAddWaybillTip); ok && handler != nil {
var remark string
vendorStatus := fmt.Sprintf("设置小费:%s", jxutils.IntPrice2StandardCurrencyString(tipFee))
if curTipFee, err := handler.GetWaybillTip(jxcontext.AdminCtx, order); err == nil {
tipFee2Add := tipFee - curTipFee
vendorStatus += fmt.Sprintf(", 本次添加:%s", jxutils.IntPrice2StandardCurrencyString(tipFee2Add))
if tipFee2Add > 0 {
err := handler.AddWaybillTip(jxcontext.AdminCtx, order, tipFee2Add)
if err == nil {
vendorStatus += "成功"
order.WaybillTipMoney += tipFee2Add
partner.CurOrderManager.UpdateOrderFields(order, []string{"WaybillTipMoney"})
} else {
vendorStatus += "失败"
remark = fmt.Sprint(err)
}
if isNeedWatch3rdWaybill(order) {
if isNeedWatchWaybillTip(order) {
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
vendorStatus += fmt.Sprintf(", 本次添加:%s", jxutils.IntPrice2StandardCurrencyString(tipFee2Add))
if tipFee2Add > 0 {
err := handler.AddWaybillTip(jxcontext.AdminCtx, order, tipFee2Add)
if err == nil {
vendorStatus += "成功"
order.WaybillTipMoney += tipFee2Add
partner.CurOrderManager.UpdateOrderFields(order, []string{"WaybillTipMoney"})
} else {
vendorStatus += "空操作"
vendorStatus += "失败"
remark = fmt.Sprint(err)
}
} else {
vendorStatus += "失败"
remark = fmt.Sprint(err)
vendorStatus += "空操作"
}
partner.CurOrderManager.OnOrderMsg(order, vendorStatus, remark)
}
if savedOrderInfo.isNeedCreate3rdWaybill {
s.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
} else {
vendorStatus += "失败"
remark = fmt.Sprint(err)
}
partner.CurOrderManager.OnOrderMsg(order, vendorStatus, remark)
}
}
utils.AfterFuncWithRecover(5*time.Minute, func() {
jxutils.CallMsgHandlerAsync(func() {
s.handleWaybillTip(savedOrderInfo)
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
})
if savedOrderInfo.isNeedCreate3rdWaybill {
s.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
}
s.setWatchOrderWaybills(savedOrderInfo, 5*time.Minute)
}
}
}