调整代码结构,修改美团配送

This commit is contained in:
邹宗楠
2022-03-04 09:49:12 +08:00
parent 9b9c44fd5d
commit 896f5d68b1
7 changed files with 243 additions and 223 deletions

View File

@@ -157,6 +157,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex
} }
newPrice = maxFee newPrice = maxFee
} }
// 门店支出运费
expend, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID) expend, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID)
if int(newPrice) > lastFee { if int(newPrice) > lastFee {
partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee

View File

@@ -252,22 +252,26 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder)
// IDeliveryPlatformHandler // IDeliveryPlatformHandler
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) { func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
db := dao.GetDB() db := dao.GetDB()
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDDada, "", model.VendorOrgTypeDelivery); err == nil {
if len(vendorOrgCode) > 0 { // 判断配送平台是否被关闭
if vendorOrgCode[0].IsOpen == model.YES { vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDDada, "", model.VendorOrgTypeDelivery)
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment) if err != nil {
}
}
} else {
return nil, err return nil, err
} }
if len(vendorOrgCode) > 0 && vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
// 获取达达第三方订单参数
billParams, err := c.getBillParams(db, order) billParams, err := c.getBillParams(db, order)
if err == nil { if err != nil {
//if globals.EnableStoreWrite return nil, err
{ }
// 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单 // 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单
var waybillList []*model.Waybill var waybillList []*model.Waybill
err2 := dao.GetRows(db, &waybillList, ` err = dao.GetRows(db, &waybillList, `
SELECT * SELECT *
FROM waybill FROM waybill
WHERE waybill_created_at > DATE_ADD(NOW(), interval -2 day) WHERE waybill_created_at > DATE_ADD(NOW(), interval -2 day)
@@ -275,33 +279,44 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
AND waybill_vendor_id = ? AND waybill_vendor_id = ?
ORDER BY id DESC ORDER BY id DESC
`, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada) `, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada)
if err != nil {
return nil, err
}
// 检查两天内是否有订单
var result *dadaapi.CreateOrderResponse var result *dadaapi.CreateOrderResponse
if err = err2; err == nil && len(waybillList) > 0 && waybillList[0].Status != model.WaybillStatusFailed { if len(waybillList) > 0 && waybillList[0].Status != model.WaybillStatusFailed {
// 再次创建
globals.SugarLogger.Debugf("CreateWaybill orderID:%s len(waybillList)=%d use ReaddOrder", order.VendorOrderID, len(waybillList)) globals.SugarLogger.Debugf("CreateWaybill orderID:%s len(waybillList)=%d use ReaddOrder", order.VendorOrderID, len(waybillList))
// 检索达达配送费阀值
if err = delivery.CallCreateWaybillPolicy(waybillList[0].ActualFee, maxDeliveryFee, order, model.VendorIDDada); err != nil { if err = delivery.CallCreateWaybillPolicy(waybillList[0].ActualFee, maxDeliveryFee, order, model.VendorIDDada); err != nil {
return nil, err return nil, err
} }
// result, err = api.DadaAPI.ReaddOrder(billParams, addParams) // 重新发送订单
result, err = api.DadaAPI.ReaddOrder(billParams) result, err = api.DadaAPI.ReaddOrder(billParams)
} else {
// 第一次创建
if err != nil { if err != nil {
globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err) globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err)
return nil, err
} }
if false {
result, err = api.DadaAPI.AddOrder(billParams)
} else { } else {
// 第一次发布订单(预发布,先查询订单运费获取平台订单号,在调用查询订单后接口发布订单)
// 查询达达订单费用
if result, err = api.DadaAPI.QueryDeliverFee(billParams); err != nil { if result, err = api.DadaAPI.QueryDeliverFee(billParams); err != nil {
return nil, err return nil, err
} }
// 阀值警报
if err = delivery.CallCreateWaybillPolicy(jxutils.StandardPrice2Int(result.Fee), maxDeliveryFee, order, model.VendorIDDada); err != nil { if err = delivery.CallCreateWaybillPolicy(jxutils.StandardPrice2Int(result.Fee), maxDeliveryFee, order, model.VendorIDDada); err != nil {
return nil, err return nil, err
} }
err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo) // 真实发布订单
if err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo); err != nil {
globals.SugarLogger.Warnf("CreateWaybill for Dada order err , orderID:%s error:%v", order.VendorOrderID, err)
return nil, err
} }
} }
if err == nil && result != nil { if result == nil {
return nil, errors.New("达达配送,平台调用错误,无订单数据返回")
}
bill = &model.Waybill{ bill = &model.Waybill{
VendorOrderID: order.VendorOrderID, VendorOrderID: order.VendorOrderID,
OrderVendorID: order.VendorID, OrderVendorID: order.VendorID,
@@ -310,12 +325,6 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
ActualFee: jxutils.StandardPrice2Int(result.Fee), ActualFee: jxutils.StandardPrice2Int(result.Fee),
} }
delivery.OnWaybillCreated(bill) delivery.OnWaybillCreated(bill)
}
}
//else {
// err = fmt.Errorf("测试环境不能真正创建运单")
//}
}
return bill, err return bill, err
} }

View File

@@ -140,6 +140,7 @@ func CalculateBillDeliveryFee(bill *model.Waybill) (deliveryFee, addFee int64) {
return deliveryFee, addFee return deliveryFee, addFee
} }
// 日志提示检查订单运费
func OnWaybillCreated(waybill *model.Waybill) { func OnWaybillCreated(waybill *model.Waybill) {
deliveryFee := int64(math.Max(float64(waybill.DesiredFee), float64(waybill.ActualFee))) deliveryFee := int64(math.Max(float64(waybill.DesiredFee), float64(waybill.ActualFee)))
if deliveryFee > alarmFee { if deliveryFee > alarmFee {

View File

@@ -87,25 +87,31 @@ func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, reson
return err return err
} }
// 创建蜂鸟配送订单
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) { func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
var ( db := dao.GetDB()
db = dao.GetDB()
) // 检查配送平台是否被禁用
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery); err == nil { vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery)
if len(vendorOrgCode) > 0 { if err != nil {
if vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
}
} else {
return nil, err return nil, err
} }
if len(vendorOrgCode) > 0 && vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
// 购物平台信息
storeDetail, err := dao.GetStoreDetail(db, order.StoreID, order.VendorID, order.VendorOrgCode) storeDetail, err := dao.GetStoreDetail(db, order.StoreID, order.VendorID, order.VendorOrgCode)
// 自定义配送费
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
if err == nil { if err != nil {
return nil, err
}
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDFengNiao); err != nil { if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDFengNiao); err != nil {
return nil, err return nil, err
} }
// 蜂鸟入参结构体
params := &fnpsapi.CreateOrderParam{ params := &fnpsapi.CreateOrderParam{
PartnerOrderCode: order.VendorOrderID, PartnerOrderCode: order.VendorOrderID,
NotifyURL: globals.FnNotifyURL, NotifyURL: globals.FnNotifyURL,
@@ -151,13 +157,20 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
}) })
} }
params.ItemsJSON = skuInfo params.ItemsJSON = skuInfo
//要求饿百的订单要传来源 //要求饿百的订单要传来源
if order.VendorID == model.VendorIDEBAI { if order.VendorID == model.VendorIDEBAI {
params.OrderSource = "109" params.OrderSource = "109"
params.ChannelOrderCode = order.VendorOrderID params.ChannelOrderCode = order.VendorOrderID
} }
// 创建蜂鸟订单
err = api.FnAPI.CreateOrder(params) err = api.FnAPI.CreateOrder(params)
if err == nil { if err != nil {
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, params, err)
return nil, err
}
bill = &model.Waybill{ bill = &model.Waybill{
VendorOrderID: order.VendorOrderID, VendorOrderID: order.VendorOrderID,
OrderVendorID: order.VendorID, OrderVendorID: order.VendorID,
@@ -167,10 +180,6 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
DesiredFee: deliveryFee, DesiredFee: deliveryFee,
} }
delivery.OnWaybillCreated(bill) delivery.OnWaybillCreated(bill)
} else {
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, params, err)
}
}
return bill, err return bill, err
} }

View File

@@ -191,22 +191,26 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
// IDeliveryPlatformHandler美团配送 // IDeliveryPlatformHandler美团配送
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) { func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
db := dao.GetDB() db := dao.GetDB()
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDMTPS, "", model.VendorOrgTypeDelivery); err == nil {
if len(vendorOrgCode) > 0 { // 检查配送平台是否被禁用
if vendorOrgCode[0].IsOpen == model.YES { vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery)
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment) if err != nil {
}
}
} else {
return nil, err return nil, err
} }
if len(vendorOrgCode) > 0 && vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
// 自定义计算预估费用 // 自定义计算预估费用
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) //deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
if err == nil { //if err != nil {
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil { // return nil, err
return nil, err //}
} // 运费预警
//if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil {
// return nil, err
//}
// 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出
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{
@@ -223,9 +227,17 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
// 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.ShopID, err = c.getMTPSShopID(order, db); err == nil { // 获取送货单id
globals.SugarLogger.Debug(billParams.ShopID) if billParams.DeliveryID, err = c.getDeliveryID(order, db); err != nil {
return nil, err
}
// 获取商铺id
if billParams.ShopID, err = c.getMTPSShopID(order, db); err != nil {
return nil, err
}
// 获取美团入参结构体
goods := &mtpsapi.GoodsDetail{ goods := &mtpsapi.GoodsDetail{
Goods: []*mtpsapi.GoodsItem{}, Goods: []*mtpsapi.GoodsItem{},
} }
@@ -244,48 +256,33 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
item.GoodCount += goodItem.GoodCount 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),
// }
// storeTel := ""
// storeID := jxutils.GetSaleStoreIDFromOrder(order)
// storeDeatail, _ := dao.GetStoreDetail(db, storeID, order.VendorID)
// if storeDeatail.Tel2 != "" {
// storeTel = ",门店电话:" + storeDeatail.Tel2
// }
billParams.Note = utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + "取货失败或配送遇到问题请联系18048531223禁止未配送直接完成定单") billParams.Note = utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + "取货失败或配送遇到问题请联系18048531223禁止未配送直接完成定单")
billParams.GoodsDetail = string(utils.MustMarshal(goods)) billParams.GoodsDetail = string(utils.MustMarshal(goods))
billParams.GoodsPickupInfo = fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq) billParams.GoodsPickupInfo = fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq)
billParams.PoiSeq = fmt.Sprintf("#%d", order.OrderSeq) billParams.PoiSeq = fmt.Sprintf("#%d", order.OrderSeq)
//if globals.EnableStoreWrite if !globals.EnableStoreWrite {
{ return nil, fmt.Errorf("测试环境不能真正创建运单")
}
// 通知美团订单,获取返回订单配送费 // 通知美团订单,获取返回订单配送费
result, err2 := api.MtpsAPI.CreateOrderByShop2(billParams) result, err := api.MtpsAPI.CreateOrderByShop2(billParams)
if err = err2; err == nil { if err != nil {
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, billParams, err)
return nil, err
}
bill = &model.Waybill{ bill = &model.Waybill{
VendorOrderID: order.VendorOrderID, VendorOrderID: order.VendorOrderID,
OrderVendorID: order.VendorID, OrderVendorID: order.VendorID,
VendorWaybillID: result.MtPeisongID, VendorWaybillID: result.MtPeisongID,
VendorWaybillID2: utils.Int64ToStr(result.DeliveryID), VendorWaybillID2: utils.Int64ToStr(result.DeliveryID),
WaybillVendorID: model.VendorIDMTPS, WaybillVendorID: model.VendorIDMTPS,
DesiredFee: int64(result.DeliveryFee * 100), DesiredFee: utils.Float64TwoInt64(result.DeliveryFee),
} }
// 当前运单总费大于配送阈值15日志打印提示 // 当前运单总费大于配送阈值15日志打印提示
delivery.OnWaybillCreated(bill) delivery.OnWaybillCreated(bill)
globals.SugarLogger.Debug("============================================>", billParams.ShopID)
} else {
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, billParams, err)
}
}
//else {
// err = fmt.Errorf("测试环境不能真正创建运单")
//}
}
}
}
return bill, err return bill, err
} }

View File

@@ -14,6 +14,9 @@ func Init() {
orm.RegisterDataBase("default", "mysql", web.AppConfig.DefaultString("dbConnectStr", "")) orm.RegisterDataBase("default", "mysql", web.AppConfig.DefaultString("dbConnectStr", ""))
orm.RegisterDataBase("c4beta", "mysql", "ubuntu:WebServer@1@tcp(111.231.218.230:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true") orm.RegisterDataBase("c4beta", "mysql", "ubuntu:WebServer@1@tcp(111.231.218.230:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true")
orm.RegisterDataBase("api", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/api?charset=utf8mb4&loc=Local&parseTime=true") orm.RegisterDataBase("api", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/api?charset=utf8mb4&loc=Local&parseTime=true")
// 本地测试服调试
//orm.RegisterDataBase("default", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true")
//orm.RegisterDataBase("api", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/api?charset=utf8mb4&loc=Local&parseTime=true")
orm.RegisterModel(new(legacymodel.Config)) orm.RegisterModel(new(legacymodel.Config))
orm.RegisterModel(new(legacymodel.BlackClient)) orm.RegisterModel(new(legacymodel.BlackClient))