- 重构创建运单策略
This commit is contained in:
@@ -3,6 +3,7 @@ package basesch
|
|||||||
import (
|
import (
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
"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/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
@@ -138,8 +139,8 @@ func (c *BaseScheduler) SelfDeliverDelivered(order *model.GoodsOrder, userName s
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) {
|
func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) {
|
||||||
globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID)
|
globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendor:%s", order.VendorOrderID, jxutils.GetVendorName(platformVendorID))
|
||||||
if !model.IsOrderSolid(order) { // 如果订单是不完整的
|
if !model.IsOrderSolid(order) { // 如果订单是不完整的
|
||||||
globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID)
|
globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID)
|
||||||
return nil, scheduler.ErrOrderIsNotSolid
|
return nil, scheduler.ErrOrderIsNotSolid
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/globals"
|
"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)
|
globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s", order.VendorOrderID, userName)
|
||||||
var errList []string
|
var errList []string
|
||||||
for _, courierVendorID := range courierVendorIDs {
|
for _, courierVendorID := range courierVendorIDs {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"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/model/legacymodel"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
)
|
)
|
||||||
@@ -515,25 +516,10 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
|
|||||||
for _, vendorID := range savedOrderInfo.supported3rdCarriers {
|
for _, vendorID := range savedOrderInfo.supported3rdCarriers {
|
||||||
handlerInfo := partner.GetDeliveryPlatformFromVendorID(vendorID)
|
handlerInfo := partner.GetDeliveryPlatformFromVendorID(vendorID)
|
||||||
if handlerInfo != nil && handlerInfo.Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) {
|
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 _, err = s.CreateWaybill(vendorID, order, delivery.DefCreateWaybillPolicy); err == nil {
|
||||||
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 {
|
|
||||||
successCount++
|
successCount++
|
||||||
} else {
|
} 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package defsch
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
@@ -75,11 +77,9 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor
|
|||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
if forceCreate || (order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) {
|
if forceCreate || (order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) {
|
||||||
if forceCreate || !s.IsOrderHasWaybill(order) {
|
if forceCreate || !s.IsOrderHasWaybill(order) {
|
||||||
var feeHandler func(deliveryFee, addFee int64) (err error)
|
feeHandler := delivery.DefCreateWaybillPolicy
|
||||||
if forceCreate {
|
if forceCreate {
|
||||||
feeHandler = func(deliveryFee, addFee int64) (err error) {
|
feeHandler = nil
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if bills, err = s.CreateWaybillOnProviders(order, userName, partner.UseableDeliveryVendorIDs, feeHandler); err == nil {
|
if bills, err = s.CreateWaybillOnProviders(order, userName, partner.UseableDeliveryVendorIDs, feeHandler); err == nil {
|
||||||
if forceCreate {
|
if forceCreate {
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ func (v *VendorSync) SyncStore(ctx *jxcontext.Context, db *dao.DaoDB, vendorID,
|
|||||||
storeMap.SyncStatus = 0
|
storeMap.SyncStatus = 0
|
||||||
_, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus)
|
_, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus)
|
||||||
}
|
}
|
||||||
err = addVendorInfo2Err(err, loopMapInfo.VendorID)
|
err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
||||||
return nil, err
|
return nil, err
|
||||||
})
|
})
|
||||||
return hint, err
|
return hint, err
|
||||||
@@ -346,7 +346,7 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
_, err = handler.SyncStoreCategory(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false)
|
_, err = handler.SyncStoreCategory(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false)
|
||||||
err = addVendorInfo2Err(err, loopMapInfo.VendorID)
|
err = jxutils.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
})
|
})
|
||||||
@@ -377,7 +377,7 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendo
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
_, err = handler.SyncStoreSkus(ctx, t, loopMapInfo.StoreMapList[0].StoreID, skuIDs, false, isContinueWhenError)
|
_, 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
|
return nil, err
|
||||||
})
|
})
|
||||||
@@ -401,7 +401,7 @@ func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, v
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
_, err = handler.FullSyncStoreSkus(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false, isContinueWhenError)
|
_, 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
|
return nil, err
|
||||||
})
|
})
|
||||||
@@ -425,7 +425,7 @@ func (v *VendorSync) DeleteRemoteStoreSkus(ctx *jxcontext.Context, db *dao.DaoDB
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
_, err = handler.DeleteRemoteStoreSkus(ctx, t, loopMapInfo.StoreMapList[0].StoreID, false, isContinueWhenError)
|
_, 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
|
return nil, err
|
||||||
})
|
})
|
||||||
@@ -543,10 +543,3 @@ func isSyncError(err error) bool {
|
|||||||
_, ok := err.(*SyncError)
|
_, ok := err.(*SyncError)
|
||||||
return ok
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -300,3 +300,14 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) {
|
|||||||
}
|
}
|
||||||
return vendorID
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,9 +19,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxOrderPrice = 6399 // 单位为分,达达最大价格,超过这个价格配送费会增加
|
maxOrderPrice = 6399 // 单位为分,达达最大价格,超过这个价格配送费会增加
|
||||||
maxOrderWeight = 5000 // 5公斤
|
maxOrderWeight = 5000 // 5公斤
|
||||||
maxDiffFee2Mtps = 150 // 与美团配送最多差价
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -102,16 +101,14 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IDeliveryPlatformHandler
|
// 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()
|
db := orm.NewOrm()
|
||||||
deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if policy != nil {
|
if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDDada); err != nil {
|
||||||
if err = policy(deliveryFee, addFee); err != nil {
|
return nil, err
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
billParams := &dadaapi.OperateOrderRequiredParams{
|
billParams := &dadaapi.OperateOrderRequiredParams{
|
||||||
// ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的
|
// ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的
|
||||||
@@ -158,9 +155,8 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
dadaFee := jxutils.StandardPrice2Int(result.Fee)
|
dadaFee := jxutils.StandardPrice2Int(result.Fee)
|
||||||
if dadaFee-deliveryFee > maxDiffFee2Mtps {
|
if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, dadaFee, order, model.VendorIDDada); err != nil {
|
||||||
globals.SugarLogger.Infof("CreateWaybill orderID:%s 达达与美团配送超价太多,达达:%d,美团配送:%d", order.VendorOrderID, dadaFee, deliveryFee)
|
return nil, err
|
||||||
return nil, ErrExceedMaxDiffFee2Mtps
|
|
||||||
}
|
}
|
||||||
err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo)
|
err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package delivery
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -17,11 +18,44 @@ import (
|
|||||||
const (
|
const (
|
||||||
warningDistance = 10 // 公里
|
warningDistance = 10 // 公里
|
||||||
warningWeight = 50 * 1000 // 克
|
warningWeight = 50 * 1000 // 克
|
||||||
|
maxDiffFee2Mtps = 150 // 与美团配送最多差价
|
||||||
|
maxAddFee = 300 // 最大增加费用,单位为分,超过不发三方配送了
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
func NullCreateWaybillPolicy(refDeliveryFee, refAddFee, deliveryFee int64) (errStr string) {
|
||||||
ErrStoreNoCoordinate = errors.New("找不到门店的坐标信息")
|
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) {
|
func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) {
|
||||||
globals.SugarLogger.Debugf("CalculateOrderDeliveryFee orderID:%s", order.VendorOrderID)
|
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 {
|
if lng == 0 || lat == 0 {
|
||||||
globals.SugarLogger.Warnf("calculateDeliveryFee 门店没有坐标信息 orderID:%s", order.VendorOrderID)
|
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)
|
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)
|
// timeAddFee = jxutils.StandardPrice2Int(3)
|
||||||
// }
|
// }
|
||||||
addFee = distanceAddFee + weightAddFee + timeAddFee
|
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
|
return deliveryFee + addFee, addFee, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,77 +115,75 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IDeliveryPlatformHandler
|
// 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()
|
db := orm.NewOrm()
|
||||||
deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if policy != nil {
|
if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDMTPS); err != nil {
|
||||||
err = policy(deliveryFee, addFee)
|
return nil, err
|
||||||
}
|
}
|
||||||
if err == nil {
|
// 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出
|
||||||
// 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出
|
lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
||||||
lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
billParams := &mtpsapi.CreateOrderByShopParam{
|
||||||
billParams := &mtpsapi.CreateOrderByShopParam{
|
OrderID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID),
|
||||||
OrderID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID),
|
DeliveryServiceCode: mtpsapi.DeliveryServiceCodeRapid,
|
||||||
DeliveryServiceCode: mtpsapi.DeliveryServiceCodeRapid,
|
ReceiverName: utils.FilterMb4(order.ConsigneeName),
|
||||||
ReceiverName: utils.FilterMb4(order.ConsigneeName),
|
ReceiverAddress: utils.FilterMb4(order.ConsigneeAddress),
|
||||||
ReceiverAddress: utils.FilterMb4(order.ConsigneeAddress),
|
ReceiverPhone: order.ConsigneeMobile,
|
||||||
ReceiverPhone: order.ConsigneeMobile,
|
CoordinateType: model.CoordinateTypeMars,
|
||||||
CoordinateType: model.CoordinateTypeMars,
|
ReceiverLng: jxutils.StandardCoordinate2Int(lngFloat),
|
||||||
ReceiverLng: jxutils.StandardCoordinate2Int(lngFloat),
|
ReceiverLat: jxutils.StandardCoordinate2Int(latFloat),
|
||||||
ReceiverLat: jxutils.StandardCoordinate2Int(latFloat),
|
GoodsValue: jxutils.IntPrice2Standard(order.ActualPayPrice), // todo 超价处理
|
||||||
GoodsValue: jxutils.IntPrice2Standard(order.ActualPayPrice), // todo 超价处理
|
GoodsWeight: float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight))),
|
||||||
GoodsWeight: float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight))),
|
// ExpectedDeliveryTime: order.ExpectedDeliveredTime.Unix(),
|
||||||
// ExpectedDeliveryTime: order.ExpectedDeliveredTime.Unix(),
|
OrderType: mtpsapi.OrderTypeASAP,
|
||||||
OrderType: mtpsapi.OrderTypeASAP,
|
}
|
||||||
}
|
if billParams.DeliveryID, err = c.getDeliveryID(order, db); err == nil {
|
||||||
if billParams.DeliveryID, err = c.getDeliveryID(order, db); err == nil {
|
if billParams.ShopID, err = c.getMTPSShopID(order, db); err == nil {
|
||||||
if billParams.ShopID, err = c.getMTPSShopID(order, db); err == nil {
|
globals.SugarLogger.Debug(billParams.ShopID)
|
||||||
globals.SugarLogger.Debug(billParams.ShopID)
|
goods := &mtpsapi.GoodsDetail{
|
||||||
goods := &mtpsapi.GoodsDetail{
|
Goods: []*mtpsapi.GoodsItem{},
|
||||||
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{}
|
goodItem.GoodName, goodItem.GoodUnit = jxutils.GetNameAndUnitFromSkuName(sku.SkuName)
|
||||||
for _, sku := range order.Skus {
|
// 好像SKU名不能重复,否则会报错,尝试处理一下
|
||||||
goodItem := &mtpsapi.GoodsItem{
|
if item, ok := goodItemMap[goodItem.GoodName]; !ok {
|
||||||
GoodCount: sku.Count,
|
goods.Goods = append(goods.Goods, goodItem)
|
||||||
GoodPrice: jxutils.IntPrice2Standard(sku.SalePrice),
|
goodItemMap[goodItem.GoodName] = goodItem
|
||||||
}
|
|
||||||
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)
|
|
||||||
} else {
|
} else {
|
||||||
bill = &model.Waybill{
|
item.GoodCount += goodItem.GoodCount
|
||||||
VendorOrderID: order.VendorOrderID,
|
}
|
||||||
OrderVendorID: order.VendorID,
|
}
|
||||||
VendorWaybillID: result.MtPeisongID,
|
addParams := map[string]interface{}{
|
||||||
VendorWaybillID2: utils.Int64ToStr(result.DeliveryID),
|
"note": utils.FilterMb4(order.BuyerComment),
|
||||||
WaybillVendorID: model.VendorIDMTPS,
|
"goods_detail": string(utils.MustMarshal(goods)),
|
||||||
DesiredFee: deliveryFee,
|
"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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,8 +146,10 @@ type ISingleStoreHandler interface {
|
|||||||
RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error)
|
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 {
|
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)
|
CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error)
|
||||||
|
|
||||||
GetVendorID() int
|
GetVendorID() int
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/weimobapi"
|
"git.rosy.net.cn/baseapi/platformapi/weimobapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"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) {
|
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDeilivery bool, userName string) (err error) {
|
||||||
if globals.EnableStoreWrite && globals.EnableWscStoreWrite && !isSelfDeilivery {
|
if globals.EnableStoreWrite && globals.EnableWscStoreWrite && !isSelfDeilivery {
|
||||||
_, err = dada.CurDeliveryHandler.CreateWaybill(order, func(deliveryFee, addFee int64) error {
|
_, err = dada.CurDeliveryHandler.CreateWaybill(order, delivery.DefCreateWaybillPolicy)
|
||||||
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
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
// 微商城没有拣货完成,模拟
|
// 微商城没有拣货完成,模拟
|
||||||
p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusFinishedPickup)
|
p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusFinishedPickup)
|
||||||
|
|||||||
Reference in New Issue
Block a user