From 10a444c8955cbd63a0cce16992c8cdcc948f6113 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 30 Mar 2019 15:00:59 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E8=BF=90=E5=8D=95=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/scheduler/basesch/basesch.go | 5 +- .../scheduler/basesch/basesch_ext.go | 2 +- .../jxcallback/scheduler/defsch/defsch.go | 20 +-- .../jxcallback/scheduler/defsch/defsch_ext.go | 8 +- business/jxstore/cms/sync.go | 17 +-- business/jxutils/jxutils_cms.go | 11 ++ business/partner/delivery/dada/waybill.go | 18 +-- business/partner/delivery/delivery.go | 44 +++++- business/partner/delivery/mtps/waybill.go | 128 +++++++++--------- business/partner/partner.go | 4 +- business/partner/purchase/weimob/wsc/order.go | 10 +- 11 files changed, 142 insertions(+), 125 deletions(-) diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index 5ce47fefb..5b0763dc8 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -3,6 +3,7 @@ package basesch import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" @@ -138,8 +139,8 @@ func (c *BaseScheduler) SelfDeliverDelivered(order *model.GoodsOrder, userName s return err } -func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) { - globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) +func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { + globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendor:%s", order.VendorOrderID, jxutils.GetVendorName(platformVendorID)) if !model.IsOrderSolid(order) { // 如果订单是不完整的 globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID) return nil, scheduler.ErrOrderIsNotSolid diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index e1baaa057..768bfd523 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -13,7 +13,7 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -func (c *BaseScheduler) CreateWaybillOnProviders(order *model.GoodsOrder, userName string, courierVendorIDs []int, policyHandler func(deliveryFee, addFee int64) error) (bills []*model.Waybill, err error) { +func (c *BaseScheduler) CreateWaybillOnProviders(order *model.GoodsOrder, userName string, courierVendorIDs []int, policyHandler partner.CreateWaybillPolicy) (bills []*model.Waybill, err error) { globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s", order.VendorOrderID, userName) var errList []string for _, courierVendorID := range courierVendorIDs { diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 5a7f57d60..37de4c8c5 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -17,6 +17,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/legacymodel" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/delivery" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) @@ -515,25 +516,10 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf for _, vendorID := range savedOrderInfo.supported3rdCarriers { handlerInfo := partner.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 savedOrderInfo.storeDeliveryType != scheduler.StoreDeliveryTypeByStore && addFee > maxAddFee { - db := orm.NewOrm() - globals.SugarLogger.Infof("createWaybillOn3rdProviders CreateWaybill orderID:%s addFee exceeded too much deliveryFee:%d, addFee:%d", order.VendorOrderID, deliveryFee, addFee) - - tmpLog := &legacymodel.TempLog{ - VendorOrderID: order.VendorOrderID, - RefVendorOrderID: order.VendorOrderID, - IntValue1: addFee, - Msg: fmt.Sprintf("createWaybillOn3rdProviders CreateWaybill orderID:%s addFee exceeded too much deliveryFee:%d, addFee:%d", order.VendorOrderID, deliveryFee, addFee), - } - db.Insert(tmpLog) - return ErrAddFeeExceeded - } - return nil - }); err == nil { + if _, err = s.CreateWaybill(vendorID, order, delivery.DefCreateWaybillPolicy); err == nil { successCount++ } else { - globals.SugarLogger.Infof("CreateWaybill orderID:%s failed with error:%v", order.VendorOrderID, err) + globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendor:%s failed with error:%v", order.VendorOrderID, jxutils.GetVendorName(vendorID), err) } } } diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index a48ba3596..d1ab801b6 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -3,6 +3,8 @@ package defsch import ( "fmt" + "git.rosy.net.cn/jx-callback/business/partner/delivery" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -75,11 +77,9 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor order := savedOrderInfo.order if forceCreate || (order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) { if forceCreate || !s.IsOrderHasWaybill(order) { - var feeHandler func(deliveryFee, addFee int64) (err error) + feeHandler := delivery.DefCreateWaybillPolicy if forceCreate { - feeHandler = func(deliveryFee, addFee int64) (err error) { - return nil - } + feeHandler = nil } if bills, err = s.CreateWaybillOnProviders(order, userName, partner.UseableDeliveryVendorIDs, feeHandler); err == nil { if forceCreate { diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 676caca07..684a6af6f 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -235,7 +235,7 @@ func (v *VendorSync) SyncStore(ctx *jxcontext.Context, db *dao.DaoDB, vendorID, storeMap.SyncStatus = 0 _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) } - err = addVendorInfo2Err(err, loopMapInfo.VendorID) + err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID) return nil, err }) return hint, err @@ -346,7 +346,7 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v return nil, err } _, err = handler.SyncStoreCategory(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false) - err = addVendorInfo2Err(err, loopMapInfo.VendorID) + err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID) } return nil, err }) @@ -377,7 +377,7 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendo return nil, err } _, err = handler.SyncStoreSkus(ctx, t, loopMapInfo.StoreMapList[0].StoreID, skuIDs, false, isContinueWhenError) - err = addVendorInfo2Err(err, loopMapInfo.VendorID) + err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID) } return nil, err }) @@ -401,7 +401,7 @@ func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, v return nil, err } _, err = handler.FullSyncStoreSkus(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false, isContinueWhenError) - err = addVendorInfo2Err(err, loopMapInfo.VendorID) + err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID) } return nil, err }) @@ -425,7 +425,7 @@ func (v *VendorSync) DeleteRemoteStoreSkus(ctx *jxcontext.Context, db *dao.DaoDB return nil, err } _, err = handler.DeleteRemoteStoreSkus(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false, isContinueWhenError) - err = addVendorInfo2Err(err, loopMapInfo.VendorID) + err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID) } return nil, err }) @@ -543,10 +543,3 @@ func isSyncError(err error) bool { _, ok := err.(*SyncError) return ok } - -func addVendorInfo2Err(inErr error, vendorID int) (outErr error) { - if inErr != nil { - outErr = fmt.Errorf("处理平台%s, %s", model.VendorChineseNames[vendorID], inErr.Error()) - } - return outErr -} diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 409c38e89..bf3595eba 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -300,3 +300,14 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) { } return vendorID } + +func GetVendorName(vendorID int) (vendorName string) { + return model.VendorChineseNames[vendorID] +} + +func AddVendorInfo2Err(inErr error, vendorID int) (outErr error) { + if inErr != nil { + outErr = fmt.Errorf("处理平台%s, %s", model.VendorChineseNames[vendorID], inErr.Error()) + } + return outErr +} diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index f52facc8c..39e523672 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -19,9 +19,8 @@ import ( ) const ( - maxOrderPrice = 6399 // 单位为分,达达最大价格,超过这个价格配送费会增加 - maxOrderWeight = 5000 // 5公斤 - maxDiffFee2Mtps = 150 // 与美团配送最多差价 + maxOrderPrice = 6399 // 单位为分,达达最大价格,超过这个价格配送费会增加 + maxOrderWeight = 5000 // 5公斤 ) var ( @@ -102,16 +101,14 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal } // IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { db := orm.NewOrm() deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) if err != nil { return nil, err } - if policy != nil { - if err = policy(deliveryFee, addFee); err != nil { - return nil, err - } + if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDDada); err != nil { + return nil, err } billParams := &dadaapi.OperateOrderRequiredParams{ // ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的 @@ -158,9 +155,8 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del return nil, err } dadaFee := jxutils.StandardPrice2Int(result.Fee) - if dadaFee-deliveryFee > maxDiffFee2Mtps { - globals.SugarLogger.Infof("CreateWaybill orderID:%s 达达与美团配送超价太多,达达:%d,美团配送:%d", order.VendorOrderID, dadaFee, deliveryFee) - return nil, ErrExceedMaxDiffFee2Mtps + if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, dadaFee, order, model.VendorIDDada); err != nil { + return nil, err } err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo) } diff --git a/business/partner/delivery/delivery.go b/business/partner/delivery/delivery.go index ed31c451d..f51b99bb2 100644 --- a/business/partner/delivery/delivery.go +++ b/business/partner/delivery/delivery.go @@ -2,6 +2,7 @@ package delivery import ( "errors" + "fmt" "math" "time" @@ -17,11 +18,44 @@ import ( const ( warningDistance = 10 // 公里 warningWeight = 50 * 1000 // 克 + maxDiffFee2Mtps = 150 // 与美团配送最多差价 + maxAddFee = 300 // 最大增加费用,单位为分,超过不发三方配送了 ) -var ( - ErrStoreNoCoordinate = errors.New("找不到门店的坐标信息") -) +func NullCreateWaybillPolicy(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) { + return "" +} + +func DefCreateWaybillPolicy(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) { + if refDeliveryFee-deliveryFee > maxDiffFee2Mtps { + errStr = fmt.Sprintf("超参考价太多, 费用:%d,参考价:%d, 最高超价:%d", deliveryFee, refDeliveryFee, maxDiffFee2Mtps) + } else if refAddFee > maxAddFee { + errStr = fmt.Sprintf("超基础价太多, 当前加价:%d, 最高加价:%d", refAddFee, maxAddFee) + } + return errStr +} + +func AddPolicy(prevPolicy, newPolicy partner.CreateWaybillPolicy) (outPolicy partner.CreateWaybillPolicy) { + return func(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) { + if errStr = prevPolicy(refDeliveryFee, refAddFee, deliveryFee); errStr == "" { + errStr = newPolicy(refDeliveryFee, refAddFee, deliveryFee) + } + return errStr + } +} + +func CallCreateWaybillPolicy(policy partner.CreateWaybillPolicy, refDeliveryFee, deliveryFee, addFee int64, order *model.GoodsOrder, waybillVendorID int) (err error) { + if policy == nil { + policy = NullCreateWaybillPolicy + } + if errStr := policy(deliveryFee, deliveryFee, addFee); errStr != "" { + waybillVendorName := jxutils.GetVendorName(waybillVendorID) + errStr = fmt.Sprintf("oderID:%s在平台%s,创建运单出错:%s", order.VendorOrderID, waybillVendorName, errStr) + globals.SugarLogger.Debugf("%s CreateWaybill failed with %s", waybillVendorName, errStr) + return errors.New(errStr) + } + return nil +} func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) { globals.SugarLogger.Debugf("CalculateOrderDeliveryFee orderID:%s", order.VendorOrderID) @@ -53,7 +87,7 @@ func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db o } if lng == 0 || lat == 0 { globals.SugarLogger.Warnf("calculateDeliveryFee 门店没有坐标信息 orderID:%s", order.VendorOrderID) - return 0, 0, ErrStoreNoCoordinate + return 0, 0, fmt.Errorf("找不到门店:%d的坐标", jxutils.GetSaleStoreIDFromOrder(order)) } lng2, lat2, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) @@ -93,7 +127,7 @@ func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db o // timeAddFee = jxutils.StandardPrice2Int(3) // } addFee = distanceAddFee + weightAddFee + timeAddFee - globals.SugarLogger.Debugf("CalculateOrderDeliveryFee orderID:%s, deliveryFee:%d addFee:%d, distance:%.3fkm distanceAddFee:%d, weight:%dg weightAddFee:%d, time:%d timeAddFee:%d", order.VendorOrderID, deliveryFee, addFee, distance, distanceAddFee, order.Weight, weightAddFee, totalSeconds, timeAddFee) + globals.SugarLogger.Debugf("CalculateOrderDeliveryFee orderID:%s, deliveryFee:%d addFee:%d, distance:%.3fkm distanceAddFee:%d, weight:%dg weightAddFee:%d, time:%s timeAddFee:%d", order.VendorOrderID, deliveryFee, addFee, distance, distanceAddFee, order.Weight, weightAddFee, utils.Time2TimeStr(billTime), timeAddFee) return deliveryFee + addFee, addFee, nil } diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index b585759da..6bf93844b 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -115,77 +115,75 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re } // IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { db := orm.NewOrm() deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) if err == nil { - if policy != nil { - err = policy(deliveryFee, addFee) + if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDMTPS); err != nil { + return nil, err } - if err == nil { - // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 - lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) - billParams := &mtpsapi.CreateOrderByShopParam{ - OrderID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), - DeliveryServiceCode: mtpsapi.DeliveryServiceCodeRapid, - ReceiverName: utils.FilterMb4(order.ConsigneeName), - ReceiverAddress: utils.FilterMb4(order.ConsigneeAddress), - ReceiverPhone: order.ConsigneeMobile, - CoordinateType: model.CoordinateTypeMars, - ReceiverLng: jxutils.StandardCoordinate2Int(lngFloat), - ReceiverLat: jxutils.StandardCoordinate2Int(latFloat), - GoodsValue: jxutils.IntPrice2Standard(order.ActualPayPrice), // todo 超价处理 - GoodsWeight: float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight))), - // 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{}, + // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 + lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) + billParams := &mtpsapi.CreateOrderByShopParam{ + OrderID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), + DeliveryServiceCode: mtpsapi.DeliveryServiceCodeRapid, + ReceiverName: utils.FilterMb4(order.ConsigneeName), + ReceiverAddress: utils.FilterMb4(order.ConsigneeAddress), + ReceiverPhone: order.ConsigneeMobile, + CoordinateType: model.CoordinateTypeMars, + ReceiverLng: jxutils.StandardCoordinate2Int(lngFloat), + ReceiverLat: jxutils.StandardCoordinate2Int(latFloat), + GoodsValue: jxutils.IntPrice2Standard(order.ActualPayPrice), // todo 超价处理 + GoodsWeight: float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight))), + // 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), } - 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.GetNameAndUnitFromSkuName(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 := map[string]interface{}{ - "note": utils.FilterMb4(order.BuyerComment), - "goods_detail": string(utils.MustMarshal(goods)), - "goods_pickup_info": fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq), - "poi_seq": fmt.Sprintf("#%d", order.OrderSeq), - } - result, err2 := api.MtpsAPI.CreateOrderByShop(billParams, addParams) - if err = err2; err != nil { - globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err) - - tmpLog := &legacymodel.TempLog{ - VendorOrderID: order.VendorOrderID, - RefVendorOrderID: order.VendorOrderID, - IntValue1: addFee, - Msg: fmt.Sprintf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err), - } - db.Insert(tmpLog) + goodItem.GoodName, goodItem.GoodUnit = jxutils.GetNameAndUnitFromSkuName(sku.SkuName) + // 好像SKU名不能重复,否则会报错,尝试处理一下 + if item, ok := goodItemMap[goodItem.GoodName]; !ok { + goods.Goods = append(goods.Goods, goodItem) + goodItemMap[goodItem.GoodName] = goodItem } else { - bill = &model.Waybill{ - VendorOrderID: order.VendorOrderID, - OrderVendorID: order.VendorID, - VendorWaybillID: result.MtPeisongID, - VendorWaybillID2: utils.Int64ToStr(result.DeliveryID), - WaybillVendorID: model.VendorIDMTPS, - DesiredFee: deliveryFee, - } + item.GoodCount += goodItem.GoodCount + } + } + addParams := map[string]interface{}{ + "note": utils.FilterMb4(order.BuyerComment), + "goods_detail": string(utils.MustMarshal(goods)), + "goods_pickup_info": fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq), + "poi_seq": fmt.Sprintf("#%d", order.OrderSeq), + } + result, err2 := api.MtpsAPI.CreateOrderByShop(billParams, addParams) + if err = err2; err != nil { + globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err) + + tmpLog := &legacymodel.TempLog{ + VendorOrderID: order.VendorOrderID, + RefVendorOrderID: order.VendorOrderID, + IntValue1: addFee, + Msg: fmt.Sprintf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err), + } + db.Insert(tmpLog) + } else { + bill = &model.Waybill{ + VendorOrderID: order.VendorOrderID, + OrderVendorID: order.VendorID, + VendorWaybillID: result.MtPeisongID, + VendorWaybillID2: utils.Int64ToStr(result.DeliveryID), + WaybillVendorID: model.VendorIDMTPS, + DesiredFee: deliveryFee, } } } diff --git a/business/partner/partner.go b/business/partner/partner.go index 03b1dd709..6674f9bd3 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -146,8 +146,10 @@ type ISingleStoreHandler interface { RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error) } +type CreateWaybillPolicy func(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) + type IDeliveryPlatformHandler interface { - CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) + CreateWaybill(order *model.GoodsOrder, policy CreateWaybillPolicy) (bill *model.Waybill, err error) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) GetVendorID() int diff --git a/business/partner/purchase/weimob/wsc/order.go b/business/partner/purchase/weimob/wsc/order.go index 41e92e0b9..b20f57bb7 100644 --- a/business/partner/purchase/weimob/wsc/order.go +++ b/business/partner/purchase/weimob/wsc/order.go @@ -5,6 +5,8 @@ import ( "sort" "time" + "git.rosy.net.cn/jx-callback/business/partner/delivery" + "git.rosy.net.cn/baseapi/platformapi/weimobapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -187,13 +189,7 @@ func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDeilivery bool, userName string) (err error) { if globals.EnableStoreWrite && globals.EnableWscStoreWrite && !isSelfDeilivery { - _, err = dada.CurDeliveryHandler.CreateWaybill(order, func(deliveryFee, addFee int64) error { - if addFee > maxAddFee { - globals.SugarLogger.Infof("PickupGoods CreateWaybill orderID:%s addFee exceeded too much deliveryFee:%d, addFee:%d", order.VendorOrderID, deliveryFee, addFee) - return errors.New("配送超过基准价太多") - } - return nil - }) + _, err = dada.CurDeliveryHandler.CreateWaybill(order, delivery.DefCreateWaybillPolicy) } // 微商城没有拣货完成,模拟 p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusFinishedPickup)