- mtwm callback
This commit is contained in:
@@ -76,6 +76,8 @@ func SplitUniversalOrderID(universalOrderID string) (orderID string, vendorID in
|
|||||||
vendorID = model.VendorIDELM
|
vendorID = model.VendorIDELM
|
||||||
} else if orderIDLen == len("15380342248732") {
|
} else if orderIDLen == len("15380342248732") {
|
||||||
vendorID = model.VendorIDEBAI
|
vendorID = model.VendorIDEBAI
|
||||||
|
} else if orderIDLen == len("33437032333978492") {
|
||||||
|
vendorID = model.VendorIDMTWM
|
||||||
} else {
|
} else {
|
||||||
// globals.SugarLogger.Errorf("unkown order type:%v", universalOrderID)
|
// globals.SugarLogger.Errorf("unkown order type:%v", universalOrderID)
|
||||||
panic(fmt.Sprintf("unkown order type:%v, orderIDLen:%d", universalOrderID, orderIDLen))
|
panic(fmt.Sprintf("unkown order type:%v, orderIDLen:%d", universalOrderID, orderIDLen))
|
||||||
|
|||||||
@@ -70,6 +70,13 @@ var (
|
|||||||
OrderTypeOrder: "订单",
|
OrderTypeOrder: "订单",
|
||||||
OrderTypeWaybill: "运单",
|
OrderTypeWaybill: "运单",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MultiStoresVendorMap = map[int]int{
|
||||||
|
VendorIDJD: 1,
|
||||||
|
VendorIDMTWM: 0,
|
||||||
|
VendorIDELM: 0,
|
||||||
|
VendorIDEBAI: 0,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -109,8 +109,12 @@ type StoreSkuSyncInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreSkus(db *DaoDB, vendorID, storeID int, skuIDs []int) (skus []*StoreSkuSyncInfo, err error) {
|
func GetStoreSkus(db *DaoDB, vendorID, storeID int, skuIDs []int) (skus []*StoreSkuSyncInfo, err error) {
|
||||||
|
tableName := "t1"
|
||||||
|
if model.MultiStoresVendorMap[vendorID] == 1 { // 多店模式平台
|
||||||
|
tableName = "t2"
|
||||||
|
}
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status, t1.%s_id, t1.%s_sync_status sku_sync_status,
|
SELECT t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status, %s.%s_id, t1.%s_sync_status sku_sync_status,
|
||||||
t2.*,
|
t2.*,
|
||||||
t3.prefix, t3.name, t3.unit, t3.img,
|
t3.prefix, t3.name, t3.unit, t3.img,
|
||||||
t4.%s_category_id vendor_vendor_cat_id,
|
t4.%s_category_id vendor_vendor_cat_id,
|
||||||
@@ -134,7 +138,7 @@ func GetStoreSkus(db *DaoDB, vendorID, storeID int, skuIDs []int) (skus []*Store
|
|||||||
sqlParams = append(sqlParams, skuIDs)
|
sqlParams = append(sqlParams, skuIDs)
|
||||||
}
|
}
|
||||||
filedPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
filedPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||||||
sql = fmt.Sprintf(sql, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix)
|
sql = fmt.Sprintf(sql, tableName, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix, filedPrefix)
|
||||||
// globals.SugarLogger.Debug(sql)
|
// globals.SugarLogger.Debug(sql)
|
||||||
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
|
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ type StoreSkuBind struct {
|
|||||||
|
|
||||||
ElmID int64 `orm:"column(elm_id);index"`
|
ElmID int64 `orm:"column(elm_id);index"`
|
||||||
EbaiID int64 `orm:"column(ebai_id);index"`
|
EbaiID int64 `orm:"column(ebai_id);index"`
|
||||||
JdID int64 `orm:"column(jd_id)"` // 无实际使用,只是为了DAO取数据语句一致
|
|
||||||
MtwmID int64 `orm:"column(mtwm_id)"` // 这个也不是必须的,只是为了DAO取数据语句一致
|
MtwmID int64 `orm:"column(mtwm_id)"` // 这个也不是必须的,只是为了DAO取数据语句一致
|
||||||
|
|
||||||
JdSyncStatus int8
|
JdSyncStatus int8
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks
|
|||||||
err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID))
|
err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID))
|
||||||
} else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
|
} else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
|
||||||
// globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false))
|
// globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false))
|
||||||
|
// todo 适当处理重复(即已经创建)的情况
|
||||||
if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil {
|
if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil {
|
||||||
updateFields = append(updateFields, model.FieldEbaiID)
|
updateFields = append(updateFields, model.FieldEbaiID)
|
||||||
isCreate = true
|
isCreate = true
|
||||||
|
|||||||
@@ -1 +1,24 @@
|
|||||||
package mtwm
|
package mtwm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
func OnOrderCallbackMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
|
||||||
|
orderID := GetOrderIDFromMsg(msg)
|
||||||
|
jxutils.CallMsgHandler(func() {
|
||||||
|
switch msg.Cmd {
|
||||||
|
case mtwmapi.MsgTypeWaybillStatus:
|
||||||
|
response = curPurchaseHandler.onWaybillMsg(msg)
|
||||||
|
default:
|
||||||
|
response = curPurchaseHandler.onOrderMsg(msg)
|
||||||
|
}
|
||||||
|
}, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM))
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderIDFromMsg(msg *mtwmapi.CallbackMsg) string {
|
||||||
|
return msg.Data.Get("order_id")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package mtwm
|
package mtwm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
"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"
|
||||||
"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/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
|
|||||||
VendorOrderID2: utils.Int64ToStr(utils.MustInterface2Int64(result["wm_order_id_view"])),
|
VendorOrderID2: utils.Int64ToStr(utils.MustInterface2Int64(result["wm_order_id_view"])),
|
||||||
VendorID: model.VendorIDMTWM,
|
VendorID: model.VendorIDMTWM,
|
||||||
VendorStoreID: result["app_poi_code"].(string),
|
VendorStoreID: result["app_poi_code"].(string),
|
||||||
StoreID: int(utils.Interface2Int64WithDefault(result["app_poi_code"].(string), 0)),
|
StoreID: int(utils.Str2Int64(result["app_poi_code"].(string))),
|
||||||
StoreName: result["wm_poi_name"].(string),
|
StoreName: result["wm_poi_name"].(string),
|
||||||
ConsigneeName: result["recipient_name"].(string),
|
ConsigneeName: result["recipient_name"].(string),
|
||||||
ConsigneeMobile: result["recipient_phone"].(string),
|
ConsigneeMobile: result["recipient_phone"].(string),
|
||||||
@@ -56,9 +56,6 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
|
|||||||
ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["total"])),
|
ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["total"])),
|
||||||
Skus: []*model.OrderSku{},
|
Skus: []*model.OrderSku{},
|
||||||
}
|
}
|
||||||
if order.StoreID > math.MaxInt32 {
|
|
||||||
order.StoreID = 0
|
|
||||||
}
|
|
||||||
order.Status = p.GetStatusFromVendorStatus(order.VendorStatus)
|
order.Status = p.GetStatusFromVendorStatus(order.VendorStatus)
|
||||||
if deliveryTime == 0 {
|
if deliveryTime == 0 {
|
||||||
order.BusinessType = model.BusinessTypeImmediate
|
order.BusinessType = model.BusinessTypeImmediate
|
||||||
@@ -71,9 +68,13 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
|
|||||||
order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng)
|
order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng)
|
||||||
order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat)
|
order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat)
|
||||||
|
|
||||||
detail := result["detail"].([]interface{})
|
var detail []map[string]interface{}
|
||||||
for _, product2 := range detail {
|
if err := utils.UnmarshalUseNumber([]byte(result["detail"].(string)), &detail); err != nil {
|
||||||
product := product2.(map[string]interface{})
|
return nil, err
|
||||||
|
}
|
||||||
|
// detail := result["detail"].([]interface{})
|
||||||
|
for _, product := range detail {
|
||||||
|
// product := product2.(map[string]interface{})
|
||||||
skuName := product["food_name"].(string)
|
skuName := product["food_name"].(string)
|
||||||
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName)
|
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName)
|
||||||
skuID := utils.Interface2String(product["sku_id"])
|
skuID := utils.Interface2String(product["sku_id"])
|
||||||
@@ -105,6 +106,42 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
|
|||||||
return order, err
|
return order, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) onOrderMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
|
||||||
|
var err error
|
||||||
|
if msg.Cmd == mtwmapi.MsgTypeNewOrder || msg.Cmd == mtwmapi.MsgTypeOrderModified {
|
||||||
|
order, err2 := c.GetOrder(GetOrderIDFromMsg(msg))
|
||||||
|
if err = err2; err == nil {
|
||||||
|
if msg.Cmd == mtwmapi.MsgTypeNewOrder {
|
||||||
|
err = partner.CurOrderManager.OnOrderNew(order, order.VendorStatus)
|
||||||
|
} else {
|
||||||
|
err = partner.CurOrderManager.OnOrderAdjust(order, order.VendorStatus)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// todo 好像没有“商家已收到”消息回调,是否需要模拟?
|
||||||
|
status := c.callbackMsg2Status(msg)
|
||||||
|
err = partner.CurOrderManager.OnOrderStatusChanged(status)
|
||||||
|
}
|
||||||
|
return mtwmapi.Err2CallbackResponse(err, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) callbackMsg2Status(msg *mtwmapi.CallbackMsg) *model.OrderStatus {
|
||||||
|
orderID := GetOrderIDFromMsg(msg)
|
||||||
|
vendorStatus := msg.Data.Get("status")
|
||||||
|
orderStatus := &model.OrderStatus{
|
||||||
|
VendorOrderID: orderID,
|
||||||
|
VendorID: model.VendorIDMTWM,
|
||||||
|
OrderType: model.OrderTypeOrder,
|
||||||
|
RefVendorOrderID: orderID,
|
||||||
|
RefVendorID: model.VendorIDMTWM,
|
||||||
|
VendorStatus: vendorStatus,
|
||||||
|
Status: c.GetStatusFromVendorStatus(vendorStatus),
|
||||||
|
StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.Data.Get("utime"))),
|
||||||
|
Remark: "",
|
||||||
|
}
|
||||||
|
return orderStatus
|
||||||
|
}
|
||||||
|
|
||||||
func getTimeFromTimestamp(timeStamp int64) time.Time {
|
func getTimeFromTimestamp(timeStamp int64) time.Time {
|
||||||
if timeStamp < 1538103149 { // 立即达订单给的是1(而不是空,0),1538103149不是特殊值,只是一个任意之前的时间,这样写可以处理
|
if timeStamp < 1538103149 { // 立即达订单给的是1(而不是空,0),1538103149不是特殊值,只是一个任意之前的时间,这样写可以处理
|
||||||
return utils.DefaultTimeValue
|
return utils.DefaultTimeValue
|
||||||
|
|||||||
16
business/partner/purchase/mtwm/order_test.go
Normal file
16
business/partner/purchase/mtwm/order_test.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package mtwm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
_ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetOrder(t *testing.T) {
|
||||||
|
result, err := new(PurchaseHandler).GetOrder("33437032333978492")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log(utils.Format4Output(result, false))
|
||||||
|
}
|
||||||
47
business/partner/purchase/mtwm/waybill.go
Normal file
47
business/partner/purchase/mtwm/waybill.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package mtwm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
VendorWaybillStatus2StatusMap = map[string]int{
|
||||||
|
mtwmapi.WaybillStatusWait4Delivery: model.WaybillStatusNew,
|
||||||
|
mtwmapi.WaybillStatusAccepted: model.WaybillStatusAccepted,
|
||||||
|
mtwmapi.WaybillStatusCourierArrived: model.WaybillStatusCourierArrived,
|
||||||
|
mtwmapi.WaybillStatusPickedup: model.WaybillStatusDelivering,
|
||||||
|
mtwmapi.WaybillStatusDelivered: model.WaybillStatusDelivered,
|
||||||
|
mtwmapi.WaybillStatusCanceled: model.WaybillStatusCanceled,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) int {
|
||||||
|
if status, ok := VendorWaybillStatus2StatusMap[vendorStatus]; ok {
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
return model.WaybillStatusUnknown
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) onWaybillMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
|
||||||
|
waybill := c.callbackMsg2Waybill(msg)
|
||||||
|
return mtwmapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(waybill), "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal *model.Waybill) {
|
||||||
|
orderID := GetOrderIDFromMsg(msg)
|
||||||
|
retVal = &model.Waybill{
|
||||||
|
VendorOrderID: orderID,
|
||||||
|
OrderVendorID: model.VendorIDMTWM,
|
||||||
|
VendorWaybillID: orderID,
|
||||||
|
WaybillVendorID: model.VendorIDMTWM,
|
||||||
|
CourierName: msg.Data.Get("dispatcher_name"),
|
||||||
|
CourierMobile: msg.Data.Get("dispatcher_mobile"),
|
||||||
|
VendorStatus: msg.Data.Get("logistics_status"),
|
||||||
|
StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.Data.Get("time"))),
|
||||||
|
Remark: "",
|
||||||
|
}
|
||||||
|
return retVal
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,6 +12,12 @@ type MtwmController struct {
|
|||||||
|
|
||||||
func (c *MtwmController) onCallbackMsg(msgType string) {
|
func (c *MtwmController) onCallbackMsg(msgType string) {
|
||||||
c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "")
|
c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "")
|
||||||
|
_, callbackResponse := api.MtwmAPI.GetCallbackMsg(c.Ctx.Request)
|
||||||
|
if callbackResponse == nil {
|
||||||
|
// callbackResponse = mtwm.OnOrderCallbackMsg(msg)
|
||||||
|
callbackResponse = mtwmapi.Err2CallbackResponse(nil, "")
|
||||||
|
}
|
||||||
|
c.Data["json"] = callbackResponse
|
||||||
c.ServeJSON()
|
c.ServeJSON()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user