- mtwm callback

This commit is contained in:
gazebo
2018-11-28 20:02:21 +08:00
parent 32c90b1678
commit ffae5e8434
10 changed files with 154 additions and 12 deletions

View File

@@ -76,6 +76,8 @@ func SplitUniversalOrderID(universalOrderID string) (orderID string, vendorID in
vendorID = model.VendorIDELM
} else if orderIDLen == len("15380342248732") {
vendorID = model.VendorIDEBAI
} else if orderIDLen == len("33437032333978492") {
vendorID = model.VendorIDMTWM
} else {
// globals.SugarLogger.Errorf("unkown order type:%v", universalOrderID)
panic(fmt.Sprintf("unkown order type:%v, orderIDLen:%d", universalOrderID, orderIDLen))

View File

@@ -70,6 +70,13 @@ var (
OrderTypeOrder: "订单",
OrderTypeWaybill: "运单",
}
MultiStoresVendorMap = map[int]int{
VendorIDJD: 1,
VendorIDMTWM: 0,
VendorIDELM: 0,
VendorIDEBAI: 0,
}
)
const (

View File

@@ -109,8 +109,12 @@ type StoreSkuSyncInfo struct {
}
func GetStoreSkus(db *DaoDB, vendorID, storeID int, skuIDs []int) (skus []*StoreSkuSyncInfo, err error) {
tableName := "t1"
if model.MultiStoresVendorMap[vendorID] == 1 { // 多店模式平台
tableName = "t2"
}
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.*,
t3.prefix, t3.name, t3.unit, t3.img,
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)
}
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)
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
return nil, err

View File

@@ -44,7 +44,6 @@ type StoreSkuBind struct {
ElmID int64 `orm:"column(elm_id);index"`
EbaiID int64 `orm:"column(ebai_id);index"`
JdID int64 `orm:"column(jd_id)"` // 无实际使用只是为了DAO取数据语句一致
MtwmID int64 `orm:"column(mtwm_id)"` // 这个也不是必须的只是为了DAO取数据语句一致
JdSyncStatus int8

View File

@@ -203,6 +203,7 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks
err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID))
} else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
// globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false))
// todo 适当处理重复(即已经创建)的情况
if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil {
updateFields = append(updateFields, model.FieldEbaiID)
isCreate = true

View File

@@ -1 +1,24 @@
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")
}

View File

@@ -1,13 +1,13 @@
package mtwm
import (
"math"
"time"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/partner"
"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"])),
VendorID: model.VendorIDMTWM,
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),
ConsigneeName: result["recipient_name"].(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"])),
Skus: []*model.OrderSku{},
}
if order.StoreID > math.MaxInt32 {
order.StoreID = 0
}
order.Status = p.GetStatusFromVendorStatus(order.VendorStatus)
if deliveryTime == 0 {
order.BusinessType = model.BusinessTypeImmediate
@@ -71,9 +68,13 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng)
order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat)
detail := result["detail"].([]interface{})
for _, product2 := range detail {
product := product2.(map[string]interface{})
var detail []map[string]interface{}
if err := utils.UnmarshalUseNumber([]byte(result["detail"].(string)), &detail); err != nil {
return nil, err
}
// detail := result["detail"].([]interface{})
for _, product := range detail {
// product := product2.(map[string]interface{})
skuName := product["food_name"].(string)
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName)
skuID := utils.Interface2String(product["sku_id"])
@@ -105,6 +106,42 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde
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 {
if timeStamp < 1538103149 { // 立即达订单给的是1而不是空01538103149不是特殊值只是一个任意之前的时间这样写可以处理
return utils.DefaultTimeValue

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

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

View File

@@ -2,7 +2,7 @@ package controllers
import (
"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"
)
@@ -12,6 +12,12 @@ type MtwmController struct {
func (c *MtwmController) onCallbackMsg(msgType string) {
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()
}