三方运单计价各管各,不在以美团为基准,创建运单只有一个限制条件,最高运费:maxDeliveryFee

优化美团运费计算,两点距离用高德API实际计算行走距离
This commit is contained in:
gazebo
2019-09-26 15:47:18 +08:00
parent 860040e6f1
commit 78930d9c1a
12 changed files with 168 additions and 125 deletions

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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)
}
}
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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
}
// 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出

View File

@@ -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)
}

View File

@@ -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)