- 京西自营商城
This commit is contained in:
@@ -136,6 +136,8 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) {
|
|||||||
vendorID = model.VendorIDMTWM
|
vendorID = model.VendorIDMTWM
|
||||||
} else if orderIDLen == len("5287873015048") {
|
} else if orderIDLen == len("5287873015048") {
|
||||||
vendorID = model.VendorIDWSC
|
vendorID = model.VendorIDWSC
|
||||||
|
} else if orderIDLen == len("1000004390") {
|
||||||
|
vendorID = model.VendorIDJX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return vendorID
|
return vendorID
|
||||||
|
|||||||
@@ -338,6 +338,10 @@ func IsOrderImportantStatus(status int) bool {
|
|||||||
return IsOrderMainStatus(status) || IsOrderLockStatus(status) || IsOrderUnlockStatus(status)
|
return IsOrderMainStatus(status) || IsOrderLockStatus(status) || IsOrderUnlockStatus(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsSpecialVendorID(vendorID int) bool {
|
||||||
|
return vendorID == VendorIDWSC || vendorID == VendorIDJX
|
||||||
|
}
|
||||||
|
|
||||||
func WaybillVendorID2Mask(vendorID int) (mask int8) {
|
func WaybillVendorID2Mask(vendorID int) (mask int8) {
|
||||||
if vendorID == VendorIDDada {
|
if vendorID == VendorIDDada {
|
||||||
mask = OrderDeliveryFlagMaskDada
|
mask = OrderDeliveryFlagMaskDada
|
||||||
|
|||||||
@@ -399,10 +399,10 @@ func GetStoreMapByStoreID(db *DaoDB, storeID, vendorID int) (storeMap *model.Sto
|
|||||||
|
|
||||||
func FakeGetStoreMapByStoreID(db *DaoDB, storeID, vendorID int) (storeMap *model.StoreMap, err error) {
|
func FakeGetStoreMapByStoreID(db *DaoDB, storeID, vendorID int) (storeMap *model.StoreMap, err error) {
|
||||||
vendorID2 := vendorID
|
vendorID2 := vendorID
|
||||||
if vendorID == model.VendorIDWSC {
|
if model.IsSpecialVendorID(vendorID) {
|
||||||
vendorID2 = model.VendorIDJD // 微商城的属性以京东属性为准(以免再绑定)
|
vendorID2 = model.VendorIDJD // 微商城与京西的属性以京东属性为准(以免再绑定)
|
||||||
}
|
}
|
||||||
if storeMap, err = GetStoreMapByStoreID(db, storeID, vendorID2); vendorID == model.VendorIDWSC && IsNoRowsError(err) {
|
if storeMap, err = GetStoreMapByStoreID(db, storeID, vendorID2); model.IsSpecialVendorID(vendorID) && IsNoRowsError(err) {
|
||||||
err = nil
|
err = nil
|
||||||
storeMap = &model.StoreMap{
|
storeMap = &model.StoreMap{
|
||||||
StoreID: storeID,
|
StoreID: storeID,
|
||||||
@@ -416,6 +416,9 @@ func FakeGetStoreMapByStoreID(db *DaoDB, storeID, vendorID int) (storeMap *model
|
|||||||
IsSync: 1,
|
IsSync: 1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if storeMap != nil && vendorID == model.VendorIDJX {
|
||||||
|
storeMap.DeliveryType = model.StoreDeliveryTypeByStore
|
||||||
|
}
|
||||||
return storeMap, err
|
return storeMap, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
package jx
|
package jx
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
appKey = "4A86853D-E4B6-454E-940A-B68ECDA2B73E"
|
appKey = "4A86853D-E4B6-454E-940A-B68ECDA2B73E"
|
||||||
|
|
||||||
MsgTypeOrder = "order"
|
MsgTypeOrder = "order"
|
||||||
SubMsgTypeOrderNew = "newOrder"
|
SubMsgTypeOrderNew = "newOrder"
|
||||||
SubMsgTypeOrderAdjust = "adjustOrder"
|
|
||||||
SubMsgTypeOrderApplyCancel = "applyCancel"
|
|
||||||
// SubMsgTypeOrderApplayRefund = "applyRefund"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CallbackResponse struct {
|
type CallbackResponse struct {
|
||||||
@@ -23,6 +25,7 @@ type CallbackMsg struct {
|
|||||||
SubMsgType string `json:"subMsgType"`
|
SubMsgType string `json:"subMsgType"`
|
||||||
ThingID string `json:"thingID"`
|
ThingID string `json:"thingID"`
|
||||||
Data string `json:"data"`
|
Data string `json:"data"`
|
||||||
|
Timestamp int64 `json:"timestamp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func OnCallbackMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
func OnCallbackMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
||||||
@@ -34,3 +37,16 @@ func OnCallbackMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
|||||||
}
|
}
|
||||||
return retVal, errCode, err
|
return retVal, errCode, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PurchaseHandler) postFakeMsg(orderNo string, status int) {
|
||||||
|
msg := &CallbackMsg{
|
||||||
|
AppKey: appKey,
|
||||||
|
MsgType: MsgTypeOrder,
|
||||||
|
SubMsgType: utils.Int2Str(status),
|
||||||
|
ThingID: orderNo,
|
||||||
|
Timestamp: time.Now().Unix(),
|
||||||
|
}
|
||||||
|
utils.CallFuncAsync(func() {
|
||||||
|
OnCallbackMsg(msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
99
business/partner/purchase/jx/jxapi.go
Normal file
99
business/partner/purchase/jx/jxapi.go
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
package jx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi"
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type API struct {
|
||||||
|
token string
|
||||||
|
appKey string
|
||||||
|
appSecret string
|
||||||
|
client *http.Client
|
||||||
|
config *platformapi.APIConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
ResponseCodeSuccess = 200
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
prodURL = "https://www.jingxicaishi.com/index.php/Weimendian/index"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
exceedLimitCodes = map[int]int{}
|
||||||
|
canRetryCodes = map[int]int{}
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
jxAPI *API
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewAPI(token, appKey, appSecret string, config ...*platformapi.APIConfig) *API {
|
||||||
|
curConfig := platformapi.DefAPIConfig
|
||||||
|
if len(config) > 0 {
|
||||||
|
curConfig = *config[0]
|
||||||
|
}
|
||||||
|
return &API{
|
||||||
|
token: token,
|
||||||
|
appKey: appKey,
|
||||||
|
appSecret: appSecret,
|
||||||
|
client: &http.Client{Timeout: curConfig.ClientTimeout},
|
||||||
|
config: &curConfig,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
jxAPI = NewAPI("", "", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) AccessAPI(apiStr string, jxParams map[string]interface{}, traceInfo string) (retVal map[string]interface{}, err error) {
|
||||||
|
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
||||||
|
func() *http.Request {
|
||||||
|
params := utils.MergeMaps(jxParams, map[string]interface{}{
|
||||||
|
"timestamp": utils.GetCurTimeStr(),
|
||||||
|
})
|
||||||
|
var request *http.Request
|
||||||
|
if false {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
fullURL := prodURL + "/" + apiStr
|
||||||
|
// baseapi.SugarLogger.Debug(utils.Map2URLValues(params).Encode())
|
||||||
|
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(utils.Map2URLValues(params).Encode()))
|
||||||
|
request.Header.Set("charset", "UTF-8")
|
||||||
|
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
}
|
||||||
|
if traceInfo != "" {
|
||||||
|
request.Header.Set(platformapi.KeyTrackInfo, traceInfo)
|
||||||
|
}
|
||||||
|
// request.Close = true //todo 为了性能考虑还是不要关闭
|
||||||
|
return request
|
||||||
|
},
|
||||||
|
a.config,
|
||||||
|
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
||||||
|
if jsonResult1 == nil {
|
||||||
|
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
||||||
|
}
|
||||||
|
code := int(utils.Interface2Int64WithDefault(jsonResult1["code"], 0))
|
||||||
|
if code == ResponseCodeSuccess {
|
||||||
|
retVal = jsonResult1
|
||||||
|
return platformapi.ErrLevelSuccess, nil
|
||||||
|
}
|
||||||
|
newErr := utils.NewErrorIntCode(jsonResult1["msg"].(string), code)
|
||||||
|
if _, ok := exceedLimitCodes[code]; ok {
|
||||||
|
return platformapi.ErrLevelExceedLimit, newErr
|
||||||
|
} else if _, ok := canRetryCodes[code]; ok {
|
||||||
|
return platformapi.ErrLevelRecoverableErr, newErr
|
||||||
|
} else {
|
||||||
|
baseapi.SugarLogger.Debugf("jx AccessAPI failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true))
|
||||||
|
return platformapi.ErrLevelCodeIsNotOK, newErr
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return retVal, err
|
||||||
|
}
|
||||||
31
business/partner/purchase/jx/jxapi_order.go
Normal file
31
business/partner/purchase/jx/jxapi_order.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package jx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
orderStatusMap = map[int]int{
|
||||||
|
model.OrderStatusFinishedPickup: 7,
|
||||||
|
model.OrderStatusDelivering: 8,
|
||||||
|
// 4,
|
||||||
|
model.OrderStatusFinished: 3,
|
||||||
|
model.OrderStatusCanceled: 3,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func translateOrderStatus(status int) (outStatus int) {
|
||||||
|
return orderStatusMap[status]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) NotifyOrderStatusChanged(order *model.GoodsOrder) (err error) {
|
||||||
|
status := translateOrderStatus(order.Status)
|
||||||
|
if status > 0 {
|
||||||
|
_, err = a.AccessAPI("orderChangeStatus", map[string]interface{}{
|
||||||
|
"orderid": order.VendorOrderID,
|
||||||
|
"status": status,
|
||||||
|
"data": "", //string(utils.MustMarshal(order)),
|
||||||
|
}, "")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
21
business/partner/purchase/jx/jxapi_order_test.go
Normal file
21
business/partner/purchase/jx/jxapi_order_test.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package jx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
_ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNotifyOrderStatusChanged(t *testing.T) {
|
||||||
|
order, err := partner.CurOrderManager.LoadOrder("920931913000041", model.VendorIDJX)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
err = jxAPI.NotifyOrderStatusChanged(order)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,15 +25,34 @@ func (c *PurchaseHandler) OnOrderMsg(msg *CallbackMsg) (retVal, errCode string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) onOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
func (c *PurchaseHandler) onOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
||||||
if msg.SubMsgType == SubMsgTypeOrderNew || msg.SubMsgType == SubMsgTypeOrderAdjust {
|
subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0))
|
||||||
|
if subMsgType == model.OrderStatusNew || subMsgType == model.OrderStatusAdjust {
|
||||||
var order *Data4Neworder
|
var order *Data4Neworder
|
||||||
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &order); err == nil {
|
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &order); err == nil {
|
||||||
retVal, errCode, err = c.onOrderNew(msg, order)
|
retVal, errCode, err = c.onOrderNew(msg, order)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
status := c.callbackMsg2Status(msg)
|
||||||
|
err = partner.CurOrderManager.OnOrderStatusChanged(status)
|
||||||
}
|
}
|
||||||
return retVal, errCode, err
|
return retVal, errCode, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
||||||
|
orderStatus := &model.OrderStatus{
|
||||||
|
VendorOrderID: msg.ThingID,
|
||||||
|
VendorID: model.VendorIDJX,
|
||||||
|
OrderType: model.OrderTypeOrder,
|
||||||
|
RefVendorOrderID: msg.ThingID,
|
||||||
|
RefVendorID: model.VendorIDJX,
|
||||||
|
VendorStatus: msg.SubMsgType,
|
||||||
|
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
||||||
|
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
||||||
|
Remark: "",
|
||||||
|
}
|
||||||
|
return orderStatus
|
||||||
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) onOrderNew(msg *CallbackMsg, order *Data4Neworder) (retVal, errCode string, err error) {
|
func (c *PurchaseHandler) onOrderNew(msg *CallbackMsg, order *Data4Neworder) (retVal, errCode string, err error) {
|
||||||
globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID)
|
globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID)
|
||||||
order.GoodsOrder.Skus = order.Skus
|
order.GoodsOrder.Skus = order.Skus
|
||||||
@@ -55,10 +74,18 @@ func (c *PurchaseHandler) GetOrder(orderID string) (order *model.GoodsOrder, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
||||||
|
if isAcceptIt {
|
||||||
|
order.Status = model.OrderStatusAccepted
|
||||||
|
} else {
|
||||||
|
order.Status = model.OrderStatusCanceled
|
||||||
|
}
|
||||||
|
c.postFakeMsg(order.VendorOrderID, order.Status)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||||
|
order.Status = model.OrderStatusFinishedPickup
|
||||||
|
c.postFakeMsg(order.VendorOrderID, order.Status)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,11 +110,17 @@ func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
|
func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
|
||||||
|
order.Status = model.OrderStatusDelivering
|
||||||
|
c.postFakeMsg(order.VendorOrderID, order.Status)
|
||||||
|
jxAPI.NotifyOrderStatusChanged(order)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 京东送达接口都是一样的
|
// 京东送达接口都是一样的
|
||||||
func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
|
func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
|
||||||
|
order.Status = model.OrderStatusFinished
|
||||||
|
c.postFakeMsg(order.VendorOrderID, order.Status)
|
||||||
|
jxAPI.NotifyOrderStatusChanged(order)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user