From ffae5e8434759a2f415e09d2384c080c59506a9d Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 28 Nov 2018 20:02:21 +0800 Subject: [PATCH] - mtwm callback --- business/jxutils/jxutils.go | 2 + business/model/const.go | 7 +++ business/model/dao/store_sku.go | 8 ++- business/model/store_sku.go | 1 - business/partner/purchase/ebai/store_sku.go | 1 + business/partner/purchase/mtwm/callback.go | 23 +++++++++ business/partner/purchase/mtwm/order.go | 53 +++++++++++++++++--- business/partner/purchase/mtwm/order_test.go | 16 ++++++ business/partner/purchase/mtwm/waybill.go | 47 +++++++++++++++++ controllers/mtwm_callback.go | 8 ++- 10 files changed, 154 insertions(+), 12 deletions(-) create mode 100644 business/partner/purchase/mtwm/order_test.go create mode 100644 business/partner/purchase/mtwm/waybill.go diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index a66643ffe..8e93048d6 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -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)) diff --git a/business/model/const.go b/business/model/const.go index fa2f733dc..a1dfa107e 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -70,6 +70,13 @@ var ( OrderTypeOrder: "订单", OrderTypeWaybill: "运单", } + + MultiStoresVendorMap = map[int]int{ + VendorIDJD: 1, + VendorIDMTWM: 0, + VendorIDELM: 0, + VendorIDEBAI: 0, + } ) const ( diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index fd7ff147f..6fe50cc29 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -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 diff --git a/business/model/store_sku.go b/business/model/store_sku.go index f13d62d51..9443bf168 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -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 diff --git a/business/partner/purchase/ebai/store_sku.go b/business/partner/purchase/ebai/store_sku.go index d5ba1731c..6652396e9 100644 --- a/business/partner/purchase/ebai/store_sku.go +++ b/business/partner/purchase/ebai/store_sku.go @@ -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 diff --git a/business/partner/purchase/mtwm/callback.go b/business/partner/purchase/mtwm/callback.go index 9fcea724a..b5a8430f8 100644 --- a/business/partner/purchase/mtwm/callback.go +++ b/business/partner/purchase/mtwm/callback.go @@ -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") +} diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 21e33a8ba..e94a9a51a 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -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(而不是空,0),1538103149不是特殊值,只是一个任意之前的时间,这样写可以处理 return utils.DefaultTimeValue diff --git a/business/partner/purchase/mtwm/order_test.go b/business/partner/purchase/mtwm/order_test.go new file mode 100644 index 000000000..ced0f03e9 --- /dev/null +++ b/business/partner/purchase/mtwm/order_test.go @@ -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)) +} diff --git a/business/partner/purchase/mtwm/waybill.go b/business/partner/purchase/mtwm/waybill.go new file mode 100644 index 000000000..340ce063a --- /dev/null +++ b/business/partner/purchase/mtwm/waybill.go @@ -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 +} diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go index 7f522a0af..9995d6f55 100644 --- a/controllers/mtwm_callback.go +++ b/controllers/mtwm_callback.go @@ -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() }