From 9fd340abfa24576c39ea7e9da3cfcf78672ba4ea Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 1 Aug 2018 12:13:27 +0800 Subject: [PATCH] - handle mtps create waybill error. - log accept or decline order error with info level. --- business/controller/mtps/waybill.go | 109 +++++++++++++++------------- business/scheduler/scheduler.go | 2 +- 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/business/controller/mtps/waybill.go b/business/controller/mtps/waybill.go index be20b1a23..eb2faae7a 100644 --- a/business/controller/mtps/waybill.go +++ b/business/controller/mtps/waybill.go @@ -25,6 +25,8 @@ const ( var ( ErrCanNotFindMTPSStore = errors.New("不能找到美团配送站点配置") ErrAddFeeExceeded = errors.New("美团配送超过基准价太多") + ErrStoreNoPriceInfo = errors.New("找不到门店的美团配送价格信息") + ErrStoreNoCoordinate = errors.New("找不到门店的坐标信息") ) type WaybillController struct { @@ -94,7 +96,7 @@ func (c *WaybillController) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) ( return retVal } -func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (delieveryFee, addFee int64) { +func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) { var lists []orm.ParamsList if db == nil { db = orm.NewOrm() @@ -108,14 +110,18 @@ func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, b `, JxStoreID).ValuesList(&lists) if err == nil && num == 1 { - delieveryFee = utils.Str2Int64(lists[0][0].(string)) + deliveryFee = utils.Str2Int64(lists[0][0].(string)) } else { globals.SugarLogger.Warnf("calculateDeliveryFee can not calculate delivery fee for orderID:%s, num:%d, error:%v", order.VendorOrderID, num, err) - return 0, 0 + return 0, 0, ErrStoreNoPriceInfo } lng := utils.Str2Float64(lists[0][1].(string)) lat := utils.Str2Float64(lists[0][2].(string)) + 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 + } lng2, lat2, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) distance := jxutils.EarthDistance(lat, lng, lat2, lng2) * 1.4 @@ -142,69 +148,72 @@ func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, b } else if totalSeconds >= 21*3600 || totalSeconds <= 6*3600 { // 21:00 -- 06:00 addFee += jxutils.StandardPrice2Int(3) } - return delieveryFee + addFee, addFee + return deliveryFee + addFee, addFee, nil } -func (c *WaybillController) calculateBillDeliveryFee(bill *model.Waybill) (delieveryFee, addFee int64) { +func (c *WaybillController) calculateBillDeliveryFee(bill *model.Waybill) (deliveryFee, addFee int64) { order, err := controller.OrderManager.LoadOrder(bill.VendorOrderID, bill.OrderVendorID) if err != nil { return 0, 0 } - return c.calculateOrderDeliveryFee(order, bill.StatusTime, nil) + deliveryFee, addFee, _ = c.calculateOrderDeliveryFee(order, bill.StatusTime, nil) + return deliveryFee, addFee } // DeliveryPlatformHandler func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { db := orm.NewOrm() - _, addFee := c.calculateOrderDeliveryFee(order, time.Now(), db) - if addFee <= maxAddFee { - // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 - lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) - billParams := &mtpsapi.CreateOrderByShopParam{ - OrderID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), - DeliveryServiceCode: mtpsapi.DeliveryServiceCodeRapid, - ReceiverName: order.ConsigneeName, - ReceiverAddress: order.ConsigneeAddress, - ReceiverPhone: order.ConsigneeMobile, - CoordinateType: model.CoordinateTypeMars, - ReceiverLng: jxutils.StandardCoordinate2Int(lngFloat), - ReceiverLat: jxutils.StandardCoordinate2Int(latFloat), - GoodsValue: jxutils.IntPrice2Standard(order.ActualPayPrice), // todo 超价处理 - GoodsWeight: float64(order.Weight) / 1000, - // ExpectedDeliveryTime: order.ExpectedDeliveredTime.Unix(), - OrderType: mtpsapi.OrderTypeASAP, - } - if billParams.DeliveryID, err = c.getDeliveryID(order, db); err == nil { - if billParams.ShopID, err = c.getMTPSShopID(order, db); err == nil { - globals.SugarLogger.Debug(billParams.ShopID) - goods := &mtpsapi.GoodsDetail{ - Goods: []*mtpsapi.GoodsItem{}, - } - goodItemMap := map[string]*mtpsapi.GoodsItem{} - for _, sku := range order.Skus { - goodItem := &mtpsapi.GoodsItem{ - GoodCount: sku.Count, - GoodPrice: jxutils.IntPrice2Standard(sku.SalePrice), + _, addFee, err := c.calculateOrderDeliveryFee(order, time.Now(), db) + if err == nil { + if addFee <= maxAddFee { + // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 + lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) + billParams := &mtpsapi.CreateOrderByShopParam{ + OrderID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), + DeliveryServiceCode: mtpsapi.DeliveryServiceCodeRapid, + ReceiverName: order.ConsigneeName, + ReceiverAddress: order.ConsigneeAddress, + ReceiverPhone: order.ConsigneeMobile, + CoordinateType: model.CoordinateTypeMars, + ReceiverLng: jxutils.StandardCoordinate2Int(lngFloat), + ReceiverLat: jxutils.StandardCoordinate2Int(latFloat), + GoodsValue: jxutils.IntPrice2Standard(order.ActualPayPrice), // todo 超价处理 + GoodsWeight: float64(order.Weight) / 1000, + // ExpectedDeliveryTime: order.ExpectedDeliveredTime.Unix(), + OrderType: mtpsapi.OrderTypeASAP, + } + if billParams.DeliveryID, err = c.getDeliveryID(order, db); err == nil { + if billParams.ShopID, err = c.getMTPSShopID(order, db); err == nil { + globals.SugarLogger.Debug(billParams.ShopID) + goods := &mtpsapi.GoodsDetail{ + Goods: []*mtpsapi.GoodsItem{}, } - goodItem.GoodName, goodItem.GoodUnit = jxutils.SplitSkuName(sku.SkuName) - // 好像SKU名不能重复,否则会报错,尝试处理一下 - if item, ok := goodItemMap[goodItem.GoodName]; !ok { - goods.Goods = append(goods.Goods, goodItem) - goodItemMap[goodItem.GoodName] = goodItem - } else { - item.GoodCount += goodItem.GoodCount + goodItemMap := map[string]*mtpsapi.GoodsItem{} + for _, sku := range order.Skus { + goodItem := &mtpsapi.GoodsItem{ + GoodCount: sku.Count, + GoodPrice: jxutils.IntPrice2Standard(sku.SalePrice), + } + goodItem.GoodName, goodItem.GoodUnit = jxutils.SplitSkuName(sku.SkuName) + // 好像SKU名不能重复,否则会报错,尝试处理一下 + if item, ok := goodItemMap[goodItem.GoodName]; !ok { + goods.Goods = append(goods.Goods, goodItem) + goodItemMap[goodItem.GoodName] = goodItem + } else { + item.GoodCount += goodItem.GoodCount + } + } + addParams := utils.Params2Map("note", order.BuyerComment, "goods_detail", string(utils.MustMarshal(goods)), "poi_seq", fmt.Sprintf("%s#%d", model.VendorChineseNames[order.VendorID], order.OrderSeq)) + _, err = api.MtpsAPI.CreateOrderByShop(billParams, addParams) + if err != nil { + globals.SugarLogger.Debugf("CreateWaybill, orderID:%s, billParams:%v, addParams:%v", order.VendorOrderID, billParams, addParams) } - } - addParams := utils.Params2Map("note", order.BuyerComment, "goods_detail", string(utils.MustMarshal(goods)), "poi_seq", fmt.Sprintf("%s#%d", model.VendorChineseNames[order.VendorID], order.OrderSeq)) - _, err = api.MtpsAPI.CreateOrderByShop(billParams, addParams) - if err != nil { - globals.SugarLogger.Debugf("CreateWaybill, orderID:%s, billParams:%v, addParams:%v", order.VendorOrderID, billParams, addParams) } } + } else { + err = ErrAddFeeExceeded + globals.SugarLogger.Infof("CreateWaybill addFee exceeded too much, it's %d", addFee) } - } else { - err = ErrAddFeeExceeded - globals.SugarLogger.Infof("CreateWaybill addFee exceeded too much, it's %d", addFee) } return err } diff --git a/business/scheduler/scheduler.go b/business/scheduler/scheduler.go index 69a5d6337..81cc1e70e 100644 --- a/business/scheduler/scheduler.go +++ b/business/scheduler/scheduler.go @@ -135,7 +135,7 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) if order.Status == model.OrderStatusNew { if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogError(func() error { + err = utils.CallFuncLogErrorWithInfo(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt) }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) }