diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 2b9763c77..2aedf74f7 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -273,7 +273,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod if !(status.Status == model.OrderStatusCanceled) { // 订单取消时,取消所有运单 curWaybill = savedOrderInfo.waybills[savedOrderInfo.order.WaybillVendorID] if status.Status == model.OrderStatusFinished { - if curWaybill != nil && curWaybill.WaybillVendorID != curWaybill.OrderVendorID { + if curWaybill != nil && !model.IsWaybillPlatformOwn(curWaybill) { globals.SugarLogger.Infof("OnOrderStatusChanged [运营2]订单orderID:%s可能被手动点击送达,会对程序状态产生不利影响,请通知门店不要这样操作!", status.VendorOrderID) } } @@ -324,9 +324,9 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if !isPending { if order.Status > model.OrderStatusEndBegin { s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) - } else if s.IsOrderHasWaybill(order) { + } else if model.IsOrderHasWaybill(order) { globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) - if s.IsOrderPlatformWaybill(bill) { // 是购物平台运单 + if model.IsWaybillPlatformOwn(bill) { // 是购物平台运单 if order.VendorID != order.WaybillVendorID { // 既有运单不是购物平台运单 globals.SugarLogger.Infof("OnWaybillStatusChanged bill:%v purchase platform bill came later than others, strange!!!", bill) oldBill := savedOrderInfo.waybills[order.WaybillVendorID] @@ -346,7 +346,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order) } // 只有购物平台的新运单消息才会启动抢单TIMER - if s.IsOrderPlatformWaybill(bill) { + if model.IsWaybillPlatformOwn(bill) { s.resetTimer(savedOrderInfo, bill, isPending) } } else { @@ -360,22 +360,22 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if (isBillExist || bill.WaybillVendorID != model.VendorIDDada) && !isPending { // todo 达达运单有错序的情况,临时看看 isBillAlreadyCandidate := s.isBillCandidate(order, bill) // todo 购买平台的运单,优先级最高,但这样写也可能带来问题,即在这个时间,因为之前3方已经接单,已经发出了转自送请求(而且可能成功了),所以加个状态判断 - if !s.IsOrderHasWaybill(order) || - (s.IsOrderPlatformWaybill(bill) && order.VendorID != order.WaybillVendorID && (order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled) == 0) { - if s.IsOrderHasWaybill(order) { + if !model.IsOrderHasWaybill(order) || + (model.IsWaybillPlatformOwn(bill) && order.VendorID != order.WaybillVendorID && (order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled) == 0) { + if model.IsOrderHasWaybill(order) { // 进到这里的原因是,在这个时间点,购物平台物流已经抢单(但抢单消息还没有被收到)(比如:818810379000941) globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may cause problem", order.VendorOrderID) } s.updateOrderByBill(order, bill, false) s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) - if s.IsOrderPlatformWaybill(bill) { + if model.IsWaybillPlatformOwn(bill) { // 强制将订单状态置为配送中? order.Status = model.OrderStatusDelivering partner.CurOrderManager.UpdateOrderStatusAndFlag(order) } else { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore || - s.IsSpecialOrderPlatformWaybill(bill) { + model.IsSpecialOrderPlatformWaybill(bill) { s.SelfDeliverDelivering(savedOrderInfo.order, bill.CourierMobile) utils.CallFuncAsync(func() { weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) @@ -389,7 +389,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) globals.SugarLogger.Infof("OnWaybillStatusChanged Accepted orderID:%s got multiple bill:%v", order.VendorOrderID, bill) } - if isBillAlreadyCandidate && !s.isWaybillCourierSame(savedOrderInfo, bill) && !s.IsOrderPlatformWaybill(bill) { + if isBillAlreadyCandidate && !s.isWaybillCourierSame(savedOrderInfo, bill) && !model.IsWaybillPlatformOwn(bill) { utils.CallFuncAsync(func() { weixinmsg.NotifyWaybillStatus(bill, order, isBillAlreadyCandidate) }) @@ -402,7 +402,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo bill.WaybillVendorID = model.VendorIDUnknown s.updateOrderByBill(order, bill, true) } - } else if s.IsOrderHasWaybill(order) { + } else if model.IsOrderHasWaybill(order) { s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) if !isPending { globals.SugarLogger.Warnf("OnWaybillStatusChanged AcceptCanceled orderID:%s got multiple bill:%v, order details:%v", order.VendorOrderID, bill, order) @@ -420,7 +420,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if s.isBillCandidate(order, bill) || order.WaybillVendorID == model.VendorIDUnknown { s.resetTimer(savedOrderInfo, nil, isPending) if !isPending { - if s.IsOrderHasWaybill(order) { + if model.IsOrderHasWaybill(order) { bill.WaybillVendorID = model.VendorIDUnknown s.updateOrderByBill(order, bill, true) } @@ -446,13 +446,13 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo case model.WaybillStatusDelivered: s.resetTimer(savedOrderInfo, bill, isPending) s.removeWaybillFromMap(savedOrderInfo, bill.WaybillVendorID) - if !s.IsOrderPlatformWaybill(bill) && !isPending { + if !model.IsWaybillPlatformOwn(bill) && !isPending { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { s.SelfDeliverDelivered(order, "") } else { s.Swtich2SelfDelivered(order, "") } - } else if s.IsSpecialOrderPlatformWaybill(bill) { + } else if model.IsSpecialOrderPlatformWaybill(bill) { s.SelfDeliverDelivered(savedOrderInfo.order, "") } if !s.isBillCandidate(order, bill) { @@ -488,7 +488,7 @@ func (s *DefScheduler) isWaybillCourierSame(savedOrderInfo *WatchOrderInfo, bill func (s *DefScheduler) addWaybill2Map(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) { if _, ok := savedOrderInfo.waybills[bill.WaybillVendorID]; ok { - if !s.IsOrderPlatformWaybill(bill) { // 购买平台重复发相同号的新运单是正常的,京东就是 + if !model.IsWaybillPlatformOwn(bill) { // 购买平台重复发相同号的新运单是正常的,京东就是 globals.SugarLogger.Warnf("addWaybill2Map bill:%v already exists", bill) } } @@ -544,7 +544,7 @@ func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2 toBeDeleted := []*model.Waybill{} for _, v := range savedOrderInfo.waybills { if v.Status < model.WaybillStatusEndBegin && - !s.IsOrderPlatformWaybill(v) && + !model.IsWaybillPlatformOwn(v) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) { err2 := s.CancelWaybill(v, cancelReasonID, cancelReason) if err2 == nil { @@ -891,18 +891,3 @@ func OnDefSchConfChanged(key, value string) { } } } - -// 判断是否是购买平台自有物流 -// 对于京东,饿百来说,就是其自有的物流,对于微商城来说,是达达 -func (s *DefScheduler) IsOrderPlatformWaybill(bill *model.Waybill) bool { - return bill.OrderVendorID == bill.WaybillVendorID || s.IsSpecialOrderPlatformWaybill(bill) -} - -// 是否是特殊物流 -func (s *DefScheduler) IsSpecialOrderPlatformWaybill(bill *model.Waybill) bool { - return (bill.OrderVendorID == model.VendorIDWSC && bill.WaybillVendorID == model.VendorIDDada) -} - -func (s *DefScheduler) IsOrderHasWaybill(order *model.GoodsOrder) bool { - return order.WaybillVendorID != model.VendorIDUnknown -} diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index f63661727..db7c1190e 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -29,24 +29,26 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { order := savedOrderInfo.order - err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) - if err == nil { - // todo - if true { //order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 { - if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { - if order.Status <= model.OrderStatusFinishedPickup { - storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID) - phone := userName - if err = err2; err == nil { - phone = storeDetail.Tel1 + if err = s.isPossibleSwitch2SelfDelivery(order); err == nil { + err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) + if err == nil { + // todo + if true { //order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 { + if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { + if order.Status <= model.OrderStatusFinishedPickup { + storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID) + phone := userName + if err = err2; err == nil { + phone = storeDetail.Tel1 + } + err = s.SelfDeliverDelivering(order, phone) + } + } else { + if order.Status <= model.OrderStatusFinishedPickup { + err = s.Swtich2SelfDeliver(order, userName) + } else if order.VendorID == order.WaybillVendorID { // 状态为配送中,且是购物平台运单,不能转自送了 + err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation } - err = s.SelfDeliverDelivering(order, phone) - } - } else { - if order.Status <= model.OrderStatusFinishedPickup { - err = s.Swtich2SelfDeliver(order, userName) - } else if order.VendorID == order.WaybillVendorID { // 状态为配送中,且是购物平台运单,不能转自送了 - err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation } } } @@ -73,17 +75,35 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder) (err error) { if !(order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) { err = fmt.Errorf("当前订单%s没有处于拣货完成且没有结束没有锁定的订单才能进行召唤配送操作", order.VendorOrderID) - } else if s.IsOrderHasWaybill(order) { + } else if model.IsOrderHasWaybill(order) { err = fmt.Errorf("当前订单%s已经有了有效的承运人%s了", order.VendorOrderID, jxutils.GetVendorName(order.WaybillVendorID)) } return err } +func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (err error) { + if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) { + if order.Status < model.OrderStatusFinishedPickup { + err = fmt.Errorf("拣货完成后才能转自配送") + } else if order.Status == model.OrderStatusFinishedPickup { + if time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { + err = fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) + } + } else if order.Status > model.OrderStatusFinishedPickup { + if model.IsOrderHaveOwnWaybill(order) { + err = fmt.Errorf("%s物流已在配送中,不能转自配送", jxutils.GetVendorName(order.VendorID)) + } + } + } + return err +} + func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps int64) (bills []*model.Waybill, err error) { order := savedOrderInfo.order - err = s.canOrderCreateWaybillNormally(order) - if forceCreate || err == nil { - err = nil + if !forceCreate { + err = s.canOrderCreateWaybillNormally(order) + } + if err == nil { feeHandler := delivery.DefCreateWaybillPolicy if forceCreate { feeHandler = delivery.NullCreateWaybillPolicy @@ -121,12 +141,12 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { order := savedOrderInfo.order - if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) && - order.Status == model.OrderStatusFinishedPickup && - time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { - return nil, fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) + if !forceCreate { + err = s.isPossibleSwitch2SelfDelivery(order) + } + if err == nil { + bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, forceCreate, maxAddFee, maxDiffFee2Mtps) } - bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, forceCreate, maxAddFee, maxDiffFee2Mtps) } else { err = scheduler.ErrCanNotFindOrder } diff --git a/business/model/order.go b/business/model/order.go index 3857174c1..b38805fb1 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -232,3 +232,24 @@ type OrderComment struct { CommentUpdatedAt time.Time UpdatedOriginalMsg string `orm:"type(text)" json:"-"` } + +// 判断是否是购买平台自有物流 +// 对于京东,饿百来说,就是其自有的物流,对于微商城来说,是达达 +func IsWaybillPlatformOwn(bill *Waybill) bool { + return bill.OrderVendorID == bill.WaybillVendorID || IsSpecialOrderPlatformWaybill(bill) +} + +// 是否是特殊物流 +func IsSpecialOrderPlatformWaybill(bill *Waybill) bool { + return (bill.OrderVendorID == VendorIDWSC && bill.WaybillVendorID == VendorIDDada) +} + +// 订单是否已经有了有效运单 +func IsOrderHasWaybill(order *GoodsOrder) bool { + return order.WaybillVendorID != VendorIDUnknown && order.VendorWaybillID != "" +} + +// 订单是否有自己平台的有效运单 +func IsOrderHaveOwnWaybill(order *GoodsOrder) bool { + return order.VendorID == order.WaybillVendorID && order.VendorWaybillID != "" +}