diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index 7e037fda1..7b7fb4f33 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -142,7 +142,7 @@ func (c *BaseScheduler) SelfDeliverDelivered(order *model.GoodsOrder, userName s return err } -func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy partner.CreateWaybillPolicyFunc) (bill *model.Waybill, err error) { +func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, maxDeliveryFee int64) (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) @@ -160,7 +160,7 @@ func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOr handlerInfo := partner.GetDeliveryPlatformFromVendorID(platformVendorID) if handlerInfo != nil && handlerInfo.Use4CreateWaybill { if c.IsReallyCallPlatformAPI { - bill, err = handlerInfo.Handler.CreateWaybill(order, policy) + bill, err = handlerInfo.Handler.CreateWaybill(order, maxDeliveryFee) if err != nil { globals.SugarLogger.Infof("CreateWaybill failed orderID:%s vendorID:%d with error:%v", order.VendorOrderID, platformVendorID, err) } else { diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index b305a96ce..35d1e3fa8 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -15,7 +15,7 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, policyHandler partner.CreateWaybillPolicyFunc, createOnlyOne bool) (bills []*model.Waybill, err error) { +func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, maxDeliveryFee int64, createOnlyOne bool) (bills []*model.Waybill, err error) { userName := ctx.GetUserName() globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s, courierVendorIDs:%v, excludeCourierVendorIDs:%v", order.VendorOrderID, userName, courierVendorIDs, excludeCourierVendorIDs) storeCourierList, err := dao.GetStoreCourierList(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, model.StoreStatusOpened) @@ -31,7 +31,7 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill { courierVendorID := storeCourier.VendorID if order.VendorID != model.VendorIDWSC || courierVendorID != model.VendorIDDada { // 达达作为微商城的自有配送,不参与配送竞争 - bill, err2 := c.CreateWaybill(courierVendorID, order, policyHandler) + bill, err2 := c.CreateWaybill(courierVendorID, order, maxDeliveryFee) if err = err2; err == nil { globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill) bills = append(bills, bill) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 55018bdb7..121d7bf50 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -625,7 +625,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { if savedOrderInfo.retryCount <= maxWaybillRetryCount { savedOrderInfo.isNeedCreate3rdWaybill = true - if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, savedOrderInfo.GetWaybillVendorIDs(), false, 1000, 1000, maxDeliveryFee); err == nil { + if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, savedOrderInfo.GetWaybillVendorIDs(), false, maxDeliveryFee); err == nil { savedOrderInfo.retryCount++ } } else { diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 4c59befb2..dac72f786 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -2,10 +2,10 @@ package defsch import ( "fmt" + "math" "time" "git.rosy.net.cn/jx-callback/business/model/dao" - "git.rosy.net.cn/jx-callback/business/partner/delivery" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -109,19 +109,16 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e return err } -func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs, excludeCourierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps, maxDeliveryFee int64) (bills []*model.Waybill, err error) { +func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs, excludeCourierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, err error) { order := savedOrderInfo.order if !forceCreate { err = s.canOrderCreateWaybillNormally(order) } if err == nil { - feeHandler := delivery.DefCreateWaybillPolicy if forceCreate { - feeHandler = delivery.NullCreateWaybillPolicy - } else if maxAddFee != 0 || maxDiffFee2Mtps != 0 || maxDeliveryFee != 0 { - feeHandler = delivery.CreateWaybillPolicy(maxDiffFee2Mtps, maxAddFee, maxDeliveryFee) + maxDeliveryFee = math.MaxInt64 } - if bills, err = s.CreateWaybillOnProviders(ctx, order, courierVendorIDs, excludeCourierVendorIDs, feeHandler, forceCreate); err == nil { + if bills, err = s.CreateWaybillOnProviders(ctx, order, courierVendorIDs, excludeCourierVendorIDs, maxDeliveryFee, forceCreate); err == nil { if forceCreate { order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order) @@ -141,7 +138,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex return nil, err } -func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, courierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps int64) (bills []*model.Waybill, err error) { +func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, courierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, err error) { jxutils.CallMsgHandler(func() { bills, err = func() (bills []*model.Waybill, err error) { userName := ctx.GetUserName() @@ -159,8 +156,8 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor err = s.isPossibleSwitch2SelfDelivery(order) } if err == nil { - if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, nil, forceCreate, maxAddFee, maxDiffFee2Mtps, 0); err == nil && len(bills) > 0 { - partner.CurOrderManager.OnOrderMsg(order, "手动创建运单成功", fmt.Sprintf("%s创建%s平台运单,强发:%t,最高加价:%d,最高差价:%d", ctx.GetUserName(), model.VendorChineseNames[bills[0].WaybillVendorID], forceCreate, maxAddFee, maxDiffFee2Mtps)) + if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, nil, forceCreate, maxDeliveryFee); err == nil && len(bills) > 0 { + partner.CurOrderManager.OnOrderMsg(order, "手动创建运单成功", fmt.Sprintf("%s创建%s平台运单,强发:%t,最高限价:%d", ctx.GetUserName(), model.VendorChineseNames[bills[0].WaybillVendorID], forceCreate, maxDeliveryFee)) } } } else { diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index ece22750d..77c91368d 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -208,6 +208,16 @@ func EarthDistance(lng1, lat1, lng2, lat2 float64) float64 { return dist * radius } +// 返回结果单元为公里 +func WalkingDistance(lng1, lat1, lng2, lat2 float64) (distance float64) { + if distance = api.AutonaviAPI.WalkingDistance(lng1, lat1, lng2, lat2); distance == 0 { + distance = EarthDistance(lng1, lat1, lng2, lat2) * 1.4 + } else { + distance /= 1000 + } + return distance +} + func StandardCoordinate2Int(value float64) int { return int(math.Round(value * 1000000)) } @@ -743,3 +753,16 @@ func GetShortNameFromURL(strURL string) (shortName string) { } return shortName } + +// 阶梯计算总量 +// stageList是一个二维数组,第一维要求是从大到小排序的,第二维是级别及单位代价 +func CalcStageValue(stageList [][]float64, totalVolume float64) (value float64) { + for _, v := range stageList { + if totalVolume > v[0] { + used := math.Ceil(totalVolume - v[0]) + value += v[1] * used + totalVolume -= used + } + } + return value +} diff --git a/business/jxutils/jxutils_test.go b/business/jxutils/jxutils_test.go index 32d16ef68..c4f3191ff 100644 --- a/business/jxutils/jxutils_test.go +++ b/business/jxutils/jxutils_test.go @@ -205,3 +205,57 @@ func TestGetShortNameFromURL(t *testing.T) { } } } + +func TestCalcStageValue(t *testing.T) { + type tTestType struct { + DesiredValue float64 + Params1 [][]float64 + Params2 float64 + } + priceStage := [][]float64{ + []float64{ + 7, + 300, + }, + []float64{ + 5, + 200, + }, + []float64{ + 3, + 100, + }, + } + for _, v := range []*tTestType{ + &tTestType{ + DesiredValue: 0, + Params1: priceStage, + Params2: 3, + }, + &tTestType{ + DesiredValue: 0, + Params1: priceStage, + Params2: 0, + }, + &tTestType{ + DesiredValue: 200, + Params1: priceStage, + Params2: 5, + }, + &tTestType{ + DesiredValue: 400, + Params1: priceStage, + Params2: 5.01, + }, + &tTestType{ + DesiredValue: 600, + Params1: priceStage, + Params2: 7, + }, + } { + value := CalcStageValue(v.Params1, v.Params2) + if value != v.DesiredValue { + t.Errorf("DesiredValue:%f, value:%f", v.DesiredValue, value) + } + } +} diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 583cdb23a..25f4594b8 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -3,7 +3,6 @@ package dada import ( "errors" "fmt" - "time" "git.rosy.net.cn/baseapi/platformapi/dadaapi" "git.rosy.net.cn/baseapi/utils" @@ -205,7 +204,6 @@ func (c *DeliveryHandler) IsErrStoreExist(err error) bool { func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) { db := dao.GetDB() deliveryFeeInfo = &partner.WaybillFeeInfo{} - deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = delivery.CalculateOrderDeliveryFee(order, time.Now(), db) billParams, addParams, err := c.getBillParams(db, order) if err == nil { var result *dadaapi.CreateOrderResponse @@ -213,6 +211,7 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf return nil, err } deliveryFeeInfo.DeliveryFee = jxutils.StandardPrice2Int(result.Fee) + deliveryFeeInfo.RefDeliveryFee = deliveryFeeInfo.DeliveryFee } return deliveryFeeInfo, err } @@ -244,15 +243,8 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder) } // IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicyFunc) (bill *model.Waybill, err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) { db := dao.GetDB() - deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) - if err != nil { - return nil, err - } - if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDDada); err != nil { - return nil, err - } billParams, addParams, err := c.getBillParams(db, order) if err == nil { if globals.EnableStoreWrite { @@ -268,13 +260,14 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. `, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada) var result *dadaapi.CreateOrderResponse if err = err2; err == nil && len(waybillList) > 0 && waybillList[0].Status != model.WaybillStatusFailed { + // 再次创建 globals.SugarLogger.Debugf("CreateWaybill orderID:%s len(waybillList)=%d use ReaddOrder", order.VendorOrderID, len(waybillList)) - dadaFee := waybillList[0].ActualFee - if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, dadaFee, order, model.VendorIDDada); err != nil { + if err = delivery.CallCreateWaybillPolicy(waybillList[0].ActualFee, maxDeliveryFee, order, model.VendorIDDada); err != nil { return nil, err } result, err = api.DadaAPI.ReaddOrder(billParams, addParams) } else { + // 第一次创建 if err != nil { globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err) } @@ -284,8 +277,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil { return nil, err } - dadaFee := jxutils.StandardPrice2Int(result.Fee) - if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, dadaFee, order, model.VendorIDDada); err != nil { + if err = delivery.CallCreateWaybillPolicy(jxutils.StandardPrice2Int(result.Fee), maxDeliveryFee, order, model.VendorIDDada); err != nil { return nil, err } err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo) @@ -296,7 +288,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. VendorOrderID: order.VendorOrderID, OrderVendorID: order.VendorID, WaybillVendorID: model.VendorIDDada, - DesiredFee: deliveryFee, + DesiredFee: jxutils.StandardPrice2Int(result.Fee), ActualFee: jxutils.StandardPrice2Int(result.Fee), } delivery.OnWaybillCreated(bill) diff --git a/business/partner/delivery/delivery.go b/business/partner/delivery/delivery.go index fd424e8d0..d16030481 100644 --- a/business/partner/delivery/delivery.go +++ b/business/partner/delivery/delivery.go @@ -1,7 +1,6 @@ package delivery import ( - "errors" "fmt" "math" "time" @@ -17,61 +16,22 @@ import ( const ( warningDistance = 10 // 公里 warningWeight = 50 * 1000 // 克 - maxDiffFee2Mtps = 200 // 与美团配送最多差价 - maxAddFee = 200 // 最大增加费用,单位为分,超过不发三方配送了 - - alarmFee = 1500 // 配送费报警阈值 + // maxDiffFee2Mtps = 200 // 与美团配送最多差价 + // maxAddFee = 200 // 最大增加费用,单位为分,超过不发三方配送了 + defMaxDeliveryFee = 10000 // 创建运单最高价 + alarmFee = 1500 // 配送费报警阈值 ) -var ( - DefCreateWaybillPolicy = CreateWaybillPolicy(maxDiffFee2Mtps, maxAddFee, 0) -) - -func NullCreateWaybillPolicy(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) { - return "" -} - -func CreateWaybillPolicy(maxDiffFee2Mtps2, maxAddFee2, maxDeliveryFee2 int64) func(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) { - if maxDiffFee2Mtps2 == 0 { - maxDiffFee2Mtps2 = maxDiffFee2Mtps +func CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee int64, order *model.GoodsOrder, waybillVendorID int) (err error) { + if maxDeliveryFee <= 0 || maxDeliveryFee > defMaxDeliveryFee { + maxDeliveryFee = defMaxDeliveryFee } - if maxAddFee2 == 0 { - maxAddFee2 = maxAddFee + if deliveryFee > maxDeliveryFee { + errStr := fmt.Sprintf("超最高限价, 所需运费:%s, 最高限价:%s", jxutils.IntPrice2StandardCurrencyString(deliveryFee), jxutils.IntPrice2StandardCurrencyString(maxDeliveryFee)) + err = fmt.Errorf(errStr) + globals.SugarLogger.Debugf("CallCreateWaybillPolicy orderID:%s, 平台:%s运单,创建出错:%s", order.VendorOrderID, model.VendorChineseNames[waybillVendorID], errStr) } - return func(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) { - if deliveryFee-refDeliveryFee > maxDiffFee2Mtps2 { - errStr = fmt.Sprintf("超参考价太多, 费用:%s,参考价:%s, 最高超价:%s", jxutils.IntPrice2StandardCurrencyString(deliveryFee), jxutils.IntPrice2StandardCurrencyString(refDeliveryFee), jxutils.IntPrice2StandardCurrencyString(maxDiffFee2Mtps2)) - } else if refAddFee > maxAddFee2 { - errStr = fmt.Sprintf("超基础价太多, 当前加价:%s, 最高加价:%s", jxutils.IntPrice2StandardCurrencyString(refAddFee), jxutils.IntPrice2StandardCurrencyString(maxAddFee2)) - } else if maxDeliveryFee2 > 0 && deliveryFee > maxDeliveryFee2 { - errStr = fmt.Sprintf("超最高限价, 所需运费:%s, 最高限价:%s", jxutils.IntPrice2StandardCurrencyString(deliveryFee), jxutils.IntPrice2StandardCurrencyString(maxDeliveryFee2)) - } - return errStr - } -} - -func AddPolicy(prevPolicy, newPolicy partner.CreateWaybillPolicyFunc) (outPolicy partner.CreateWaybillPolicyFunc) { - 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.CreateWaybillPolicyFunc, refDeliveryFee, refAddFee, deliveryFee int64, order *model.GoodsOrder, waybillVendorID int) (err error) { - waybillVendorName := jxutils.GetVendorName(waybillVendorID) - globals.SugarLogger.Debugf("CallCreateWaybillPolicy orderID:%s, refDeliveryFee:%d, refAddFee:%d, deliveryFee:%d, waybillVendor:%s", - order.VendorOrderID, refDeliveryFee, refAddFee, deliveryFee, waybillVendorName) - if policy == nil { - policy = NullCreateWaybillPolicy - } - if errStr := policy(refDeliveryFee, refAddFee, deliveryFee); errStr != "" { - errStr = fmt.Sprintf("oderID:%s创建运单出错:%s", order.VendorOrderID, errStr) - globals.SugarLogger.Debugf("%s CallCreateWaybillPolicy failed with %s", waybillVendorName, errStr) - return errors.New(errStr) - } - return nil + return err } func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db *dao.DaoDB) (deliveryFee, addFee int64, err error) { @@ -82,21 +42,26 @@ func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db * jxStoreID := jxutils.GetSaleStoreIDFromOrder(order) var lng, lat float64 priceInfo := &struct { - Price int - Lng int - Lat int + CityPrice int64 + DistrictPrice int64 + Lng int + Lat int }{} if err = dao.GetRow(db, priceInfo, ` - SELECT t2.mtps_price price, t1.lng, t1.lat + SELECT + t2.mtps_price city_price, t2.mtps_price district_price, t1.lng, t1.lat FROM store t1 - JOIN place t2 ON t1.city_code = t2.code + LEFT JOIN place t2 ON t2.level = 2 AND t2.code = t1.city_code + LEFT JOIN place t3 ON t3.level = 3 AND t2.code = t1.district_code WHERE t1.id = ? AND t1.deleted_at = ? `, jxStoreID, utils.DefaultTimeValue); err != nil { return 0, 0, err } lng = jxutils.IntCoordinate2Standard(priceInfo.Lng) lat = jxutils.IntCoordinate2Standard(priceInfo.Lat) - deliveryFee = int64(priceInfo.Price) + if deliveryFee = priceInfo.DistrictPrice; deliveryFee == 0 { + deliveryFee = priceInfo.CityPrice + } if deliveryFee == 0 { globals.SugarLogger.Warnf("CalculateOrderDeliveryFee 查不到美团配送价格 orderID:%s", order.VendorOrderID) deliveryFee = 650 @@ -108,40 +73,55 @@ func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db * lng2, lat2, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) var distanceAddFee, weightAddFee, timeAddFee int64 - distance := jxutils.EarthDistance(lng, lat, lng2, lat2) * 1.4 - if distance < 3 { - } else if distance < 5 { - distanceAddFee = jxutils.StandardPrice2Int(math.Ceil(distance - 3)) - } else { - distanceAddFee = jxutils.StandardPrice2Int(2 + 2*math.Ceil(distance-5)) - if distance > warningDistance { - globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,距离%.3fkm太远,请检查门店坐标信息", order.VendorOrderID, distance) - } - } - globals.SugarLogger.Debugf("CalculateOrderDeliveryFee orderID:%s", order.VendorOrderID) - if order.Weight < 5*1000 { - } else if order.Weight < 10*1000 { - weightAddFee = jxutils.StandardPrice2Int(0.5 * float64(jxutils.IntWeight2Float(order.Weight)-5)) - } else if order.Weight < 20*1000 { - weightAddFee = jxutils.StandardPrice2Int(2.5 + 1*float64(jxutils.IntWeight2Float(order.Weight)-10)) - } else { - weightAddFee = jxutils.StandardPrice2Int(2.5 + 10 + 2*float64(jxutils.IntWeight2Float(order.Weight)-20)) - if order.Weight > warningWeight { - globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,重量:%dg太重,请检查商品属性", order.VendorOrderID, order.Weight) - } + // 距离加价 + distance := jxutils.WalkingDistance(lng, lat, lng2, lat2) + if distance > warningDistance { + globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,距离%.3fkm太远,请检查门店坐标信息", order.VendorOrderID, distance) } + distanceAddFee = int64(jxutils.CalcStageValue([][]float64{ + []float64{ + 7, + 300, + }, + []float64{ + 5, + 200, + }, + []float64{ + 3, + 100, + }, + }, distance)) + // 重量加价 + if order.Weight > warningWeight { + globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,重量:%dg太重,请检查商品属性", order.VendorOrderID, order.Weight) + } + weightAddFee = int64(jxutils.CalcStageValue([][]float64{ + []float64{ + 20, + 200, + }, + []float64{ + 10, + 100, + }, + []float64{ + 5, + 50, + }, + }, float64(order.Weight)/1000)) + + // 其它加价 hour, min, sec := billTime.Clock() totalSeconds := hour*3600 + min*60 + sec // 午高峰加价 if totalSeconds >= 11*3600 && totalSeconds <= 14*3600 { // 11:00 -- 14:00 + timeAddFee = jxutils.StandardPrice2Int(2) + } else if totalSeconds >= 21*3600 || totalSeconds <= 6*3600 { // 21:00 -- 06:00 夜间加价 timeAddFee = jxutils.StandardPrice2Int(3) } - // 夜间加价 - // else if totalSeconds >= 21*3600 || totalSeconds <= 6*3600 { // 21:00 -- 06:00 - // 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:%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 dd6ff47f4..105381db3 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -127,11 +127,11 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf } // IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicyFunc) (bill *model.Waybill, err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) { db := dao.GetDB() - deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) + deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) if err == nil { - if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDMTPS); err != nil { + if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil { return nil, err } // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 diff --git a/business/partner/partner_delivery.go b/business/partner/partner_delivery.go index 829bbd335..3c3869413 100644 --- a/business/partner/partner_delivery.go +++ b/business/partner/partner_delivery.go @@ -18,8 +18,8 @@ const ( type WaybillFeeInfo struct { ErrCode int `json:"errCode"` ErrStr string `json:"errStr"` - RefDeliveryFee int64 `json:"refDeliveryFee"` - RefAddFee int64 `json:"refAddFee"` + RefDeliveryFee int64 `json:"refDeliveryFee"` // 无用,待删除 + RefAddFee int64 `json:"refAddFee"` // 无用,待删除 DeliveryFee int64 `json:"deliveryFee"` TimeoutSecond int `json:"timeoutSecond"` // 系统会自动发运单的倒计时 Waybill *model.Waybill `json:"waybill"` @@ -35,7 +35,7 @@ type IDeliveryPlatformHandler interface { IsErrStoreNotExist(err error) bool IsErrStoreExist(err error) bool - CreateWaybill(order *model.GoodsOrder, policy CreateWaybillPolicyFunc) (bill *model.Waybill, err error) + CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *WaybillFeeInfo, err error) } diff --git a/business/partner/purchase/weimob/wsc/order.go b/business/partner/purchase/weimob/wsc/order.go index 4b8c76c1c..86b315f09 100644 --- a/business/partner/purchase/weimob/wsc/order.go +++ b/business/partner/purchase/weimob/wsc/order.go @@ -5,8 +5,6 @@ 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" @@ -199,7 +197,7 @@ func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { globals.SugarLogger.Debugf("wsc PickupGoods orderID:%s, isSelfDelivery:%t", order.VendorOrderID, isSelfDelivery) if globals.EnableWscStoreWrite && !isSelfDelivery { - _, err = dada.CurDeliveryHandler.CreateWaybill(order, delivery.DefCreateWaybillPolicy) + _, err = dada.CurDeliveryHandler.CreateWaybill(order, 0) } // 微商城没有拣货完成,模拟 p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusFinishedPickup) diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 05136de1b..898afdda1 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -115,9 +115,8 @@ func (c *OrderController) QueryOrderWaybillFeeInfo() { // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属的厂商ID" // @Param courierVendorIDs formData string false "运单厂商ID(缺省全部)" +// @Param maxDeliveryFee formData int false "最高限价(为0时为缺省最大值)" // @Param forceCreate formData bool false "是否强制创建(忽略订单状态检查及其它参数)" -// @Param maxAddFee formData int false "最大加价,单位为分(为0时为缺省值)" -// @Param maxDiffFee2Mtps formData int false "最大与美团配送差价,单位为分(maxAddFee不为0时才可能有效)" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /CreateWaybillOnProviders [post] @@ -125,7 +124,7 @@ func (c *OrderController) CreateWaybillOnProviders() { c.callCreateWaybillOnProviders(func(params *tOrderCreateWaybillOnProvidersParams) (retVal interface{}, errCode string, err error) { var courierVendorIDs []int if err = jxutils.Strings2Objs(params.CourierVendorIDs, &courierVendorIDs); err == nil { - retVal, err = defsch.FixedScheduler.CreateWaybillOnProvidersEx(params.Ctx, params.VendorOrderID, params.VendorID, courierVendorIDs, params.ForceCreate, int64(params.MaxAddFee), int64(params.MaxDiffFee2Mtps)) + retVal, err = defsch.FixedScheduler.CreateWaybillOnProvidersEx(params.Ctx, params.VendorOrderID, params.VendorID, courierVendorIDs, params.ForceCreate, int64(params.MaxDeliveryFee)) } return retVal, "", err })