From 0f68d904bd9b989248a986cd27c20fc06ba3d199 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 29 Aug 2018 21:37:48 +0800 Subject: [PATCH] - treat DeliveryStatusFailedGetGoods as WaybillStatusFailed for jd waybill - adjust defsch. --- .../jxcallback/scheduler/defsch/defsch.go | 96 +++++++++++-------- business/jxutils/jxutils.go | 2 +- business/jxutils/jxutils_test.go | 12 +-- business/partner/delivery/mtps/waybill.go | 6 +- business/partner/purchase/jd/waybill.go | 2 +- 5 files changed, 66 insertions(+), 52 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 1aed5dcdc..8c071bd4b 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -281,10 +281,20 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) } else if order.WaybillVendorID != model.VendorIDUnknown { globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) - if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID { + if order.VendorID == bill.WaybillVendorID { // 是购物平台运单 + 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] + if oldBill != nil { + s.CancelWaybill(oldBill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) + } else { + globals.SugarLogger.Warnf("OnWaybillStatusChanged bill:%v, oldBill is null, strange!!!", bill) + } + } + bill.WaybillVendorID = model.VendorIDUnknown + s.updateOrderByBill(order, bill, false) + } else { s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) - } else if bill.WaybillVendorID == order.VendorID && order.WaybillVendorID != order.VendorID { - globals.SugarLogger.Warnf("OnWaybillStatusChanged bill:%v purchase platform bill came later than others, strange!!!", bill) } } } @@ -423,56 +433,60 @@ func (s *DefScheduler) removeWaybillFromMap(savedOrderInfo *WatchOrderInfo, wayb func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInfo, excludeBill *model.Waybill) (err error) { order := savedOrderInfo.order globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, excludeBill:%v", order.VendorOrderID, order.Status, excludeBill) - if order.LockStatus == model.OrderStatusUnknown && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin { // 订单在配送中被取消时就是配送中状态 - if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { - if savedOrderInfo.retryCount <= maxWaybillRetryCount { - successCount := 0 - for _, vendorID := range savedOrderInfo.supported3rdCarriers { - handlerInfo := s.GetDeliveryPlatformFromVendorID(vendorID) - if handlerInfo != nil && handlerInfo.Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) { - if _, err = s.CreateWaybill(vendorID, order, func(deliveryFee, addFee int64) error { - if addFee > maxAddFee { - db := orm.NewOrm() - globals.SugarLogger.Infof("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee) + if order.WaybillVendorID == model.VendorIDUnknown { + if order.LockStatus == model.OrderStatusUnknown && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin { // 订单在配送中被取消时就是配送中状态 + if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { + if savedOrderInfo.retryCount <= maxWaybillRetryCount { + successCount := 0 + for _, vendorID := range savedOrderInfo.supported3rdCarriers { + handlerInfo := s.GetDeliveryPlatformFromVendorID(vendorID) + if handlerInfo != nil && handlerInfo.Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) { + if _, err = s.CreateWaybill(vendorID, order, func(deliveryFee, addFee int64) error { + if addFee > maxAddFee { + db := orm.NewOrm() + globals.SugarLogger.Infof("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee) - tmpLog := &legacymodel.TempLog{ - VendorOrderID: order.VendorOrderID, - RefVendorOrderID: order.VendorOrderID, - IntValue1: addFee, - Msg: fmt.Sprintf("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee), + tmpLog := &legacymodel.TempLog{ + VendorOrderID: order.VendorOrderID, + RefVendorOrderID: order.VendorOrderID, + IntValue1: addFee, + Msg: fmt.Sprintf("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee), + } + db.Insert(tmpLog) + return ErrAddFeeExceeded } - db.Insert(tmpLog) - return ErrAddFeeExceeded + return nil + }); err == nil { + successCount++ } - return nil - }); err == nil { - successCount++ } } - } - if successCount != 0 { - savedOrderInfo.retryCount++ - err = nil + if successCount != 0 { + savedOrderInfo.retryCount++ + err = nil + } else { + globals.SugarLogger.Infof("createWaybillOn3rdProviders, orderID:%s all failed", order.VendorOrderID) + err = scheduler.ErrCanNotCreateAtLeastOneWaybill + } } else { - globals.SugarLogger.Infof("createWaybillOn3rdProviders, orderID:%s all failed", order.VendorOrderID) - err = scheduler.ErrCanNotCreateAtLeastOneWaybill + globals.SugarLogger.Infof("createWaybillOn3rdProviders [运营]同一订单orderID:%s尝试了%d次创建运单失败, 停止调度,如果还需要发单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount) + + tmpLog := &legacymodel.TempLog{ + VendorOrderID: order.VendorOrderID, + RefVendorOrderID: order.VendorOrderID, + Msg: fmt.Sprintf("createWaybillOn3rdProviders, orderID:%s failed %d times, stop schedule", order.VendorOrderID, savedOrderInfo.retryCount), + } + db := orm.NewOrm() + db.Insert(tmpLog) } } else { - globals.SugarLogger.Infof("createWaybillOn3rdProviders [运营]同一订单orderID:%s尝试了%d次创建运单失败, 停止调度,如果还需要发单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount) - - tmpLog := &legacymodel.TempLog{ - VendorOrderID: order.VendorOrderID, - RefVendorOrderID: order.VendorOrderID, - Msg: fmt.Sprintf("createWaybillOn3rdProviders, orderID:%s failed %d times, stop schedule", order.VendorOrderID, savedOrderInfo.retryCount), - } - db := orm.NewOrm() - db.Insert(tmpLog) + globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, store:%d dont't support 3rd delivery platform", order.VendorOrderID, jxutils.GetJxStoreIDFromOrder(order)) } } else { - globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, store:%d dont't support 3rd delivery platform", order.VendorOrderID, jxutils.GetJxStoreIDFromOrder(order)) + globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d doesn't match model.OrderStatusFinishedPickup, bypass", order.VendorOrderID, order.Status) } } else { - globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d doesn't match model.OrderStatusFinishedPickup, bypass", order.VendorOrderID, order.Status) + globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, waybillVendorID:%d, vendorWaybilID:%s is not empty, bypass", order.VendorOrderID, order.WaybillVendorID, order.VendorWaybillID) } return err } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index d44325383..7f1d99a0c 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -155,7 +155,7 @@ func CallMsgHandlerAsync(handler func(), primaryID string) { }, primaryID) } -func SplitSkuName(fullName string) (name string, unit string) { +func GetNameAndUnitFromSkuName(fullName string) (name string, unit string) { unit = "份" index := strings.Index(fullName, "/") if index >= 0 { diff --git a/business/jxutils/jxutils_test.go b/business/jxutils/jxutils_test.go index d8d18fbba..b2a3fc2a0 100644 --- a/business/jxutils/jxutils_test.go +++ b/business/jxutils/jxutils_test.go @@ -29,24 +29,24 @@ func TestMapValue2Scope(t *testing.T) { } } -func TestSplitSkuName(t *testing.T) { - name, unit := SplitSkuName("【满59免运】蒜苔肉丝约400g/个(蒜苔约250g 肉丝约150g/份)") +func TestGetNameAndUnitFromSkuName(t *testing.T) { + name, unit := GetNameAndUnitFromSkuName("【满59免运】蒜苔肉丝约400g/个(蒜苔约250g 肉丝约150g/份)") if name != "【满59免运】蒜苔肉丝约400g" || unit != "个" { t.Fatalf("SplitSkuName wrong, name:%s, unit:%s", name, unit) } - name, unit = SplitSkuName("【满59免运】蒜苔肉丝约400g/g份(蒜苔约250g 肉丝约150g/份)") + name, unit = GetNameAndUnitFromSkuName("【满59免运】蒜苔肉丝约400g/g份(蒜苔约250g 肉丝约150g/份)") if name != "【满59免运】蒜苔肉丝约400g" || unit != "g" { t.Fatalf("SplitSkuName wrong, name:%s, unit:%s", name, unit) } - name, unit = SplitSkuName("【满59免运】蒜苔肉丝约400g/个") + name, unit = GetNameAndUnitFromSkuName("【满59免运】蒜苔肉丝约400g/个") if name != "【满59免运】蒜苔肉丝约400g" || unit != "个" { t.Fatalf("SplitSkuName wrong, name:%s, unit:%s", name, unit) } - name, unit = SplitSkuName("【满59免运】蒜苔肉丝约400g/") + name, unit = GetNameAndUnitFromSkuName("【满59免运】蒜苔肉丝约400g/") if name != "【满59免运】蒜苔肉丝约400g" || unit != "份" { t.Fatalf("SplitSkuName wrong, name:%s, unit:%s", name, unit) } - name, unit = SplitSkuName("【满59免运】蒜苔肉丝约400g") + name, unit = GetNameAndUnitFromSkuName("【满59免运】蒜苔肉丝约400g") if name != "【满59免运】蒜苔肉丝约400g" || unit != "份" { t.Fatalf("SplitSkuName wrong, name:%s, unit:%s", name, unit) } diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 2be20852d..f313d1806 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -126,8 +126,8 @@ func (c *DeliveryHandler) calculateOrderDeliveryFee(order *model.GoodsOrder, bil return 0, 0, ErrStoreNoPriceInfo } - lng := utils.Str2Float64(lists[0][1].(string)) - lat := utils.Str2Float64(lists[0][2].(string)) + lng := utils.Str2Float64(utils.Interface2String(lists[0][1])) + lat := utils.Str2Float64(utils.Interface2String(lists[0][2])) if lng == 0 || lat == 0 { globals.SugarLogger.Warnf("calculateDeliveryFee can not calculate delivery fee for orderID:%s, because no coordinate info", order.VendorOrderID) return 0, 0, ErrStoreNoCoordinate @@ -207,7 +207,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del GoodCount: sku.Count, GoodPrice: jxutils.IntPrice2Standard(sku.SalePrice), } - goodItem.GoodName, goodItem.GoodUnit = jxutils.SplitSkuName(sku.SkuName) + goodItem.GoodName, goodItem.GoodUnit = jxutils.GetNameAndUnitFromSkuName(sku.SkuName) // 好像SKU名不能重复,否则会报错,尝试处理一下 if item, ok := goodItemMap[goodItem.GoodName]; !ok { goods.Goods = append(goods.Goods, goodItem) diff --git a/business/partner/purchase/jd/waybill.go b/business/partner/purchase/jd/waybill.go index c8409be8b..b633dd3e7 100644 --- a/business/partner/purchase/jd/waybill.go +++ b/business/partner/purchase/jd/waybill.go @@ -38,7 +38,7 @@ func (c *PurchaseHandler) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (re order.Status = model.WaybillStatusDelivering case jdapi.DeliveryStatusFinished: order.Status = model.WaybillStatusDelivered - case jdapi.DeliveryStatusFailedDelivery: //, jdapi.DeliveryStatusFailedGetGoods: todo 取货失败不当成投递失败 + case jdapi.DeliveryStatusFailedDelivery, jdapi.DeliveryStatusFailedGetGoods: // todo 取货失败需不需要当成运单失败? order.Status = model.WaybillStatusFailed default: order.Status = model.WaybillStatusUnknown