- 标准化京东到家门店相关API

This commit is contained in:
gazebo
2019-09-19 14:56:57 +08:00
parent 3764e05b14
commit 0d10f7897a
2 changed files with 239 additions and 62 deletions

View File

@@ -29,6 +29,12 @@ const (
KeyStandByPhone = "standByPhone"
)
const (
CarrierNoCrowdSourcing = 9966 // 众包
CarrierNoSelfDelivery = 2938 // 自送
CarrierNoSelfTake = 9999 // 到店自提
)
type CreateShopResult struct {
DeliveryRangeType int `json:"deliveryRangeType"`
CoordinatePoints string `json:"coordinatePoints"`
@@ -44,11 +50,164 @@ type CityInfo struct {
Yn int `json:"yn"`
}
const (
CarrierNoCrowdSourcing = 9966 // 众包
CarrierNoSelfDelivery = 2938 // 自送
CarrierNoSelfTake = 9999 // 到店自提
)
type OpStoreParams struct {
// 以下可用于修改(及查询)
StationNo string `json:"stationNo"` // 强制参数,主键
StationName string `json:"stationName,omitempty"`
OutSystemID string `json:"outSystemId,omitempty"`
Mobile string `json:"mobile,omitempty"`
Phone string `json:"phone,omitempty"`
Lat float64 `json:"lat,omitempty"`
Lng float64 `json:"lng,omitempty"`
City int `json:"city,omitempty"`
County int `json:"county,omitempty"`
StationAddress string `json:"stationAddress,omitempty"`
Operator string `json:"operator"` // 返回值无
ServiceTimeEnd1 int `json:"serviceTimeEnd1,omitempty"`
ServiceTimeStart1 int `json:"serviceTimeStart1,omitempty"`
ServiceTimeEnd2 int `json:"serviceTimeEnd2,omitempty"`
ServiceTimeStart2 int `json:"serviceTimeStart2,omitempty"`
DeliveryRangeType int8 `json:"deliveryRangeType,omitempty"` // 返回值无划分配送服务范围的类型3、圆心半径、2、不规则多边形手动画范围。若更新此字段需传完整值。
CoordinateType int `json:"coordinateType,omitempty"` // 返回值无,使用的地图类型(1,谷歌), (2,百度), (3,高德), (4,腾讯)
DeliveryRangeRadius int `json:"deliveryRangeRadius,omitempty"` // 返回值无,时效服务范围半径(单位:米)如果服务范围为类型3的话该字段有值
CoordinatePoints string `json:"coordinatePoints,omitempty"` // 返回值无坐标点集合如果服务范围为类型2的话该字段有值每个点以经度,纬度 的格式表示,用“;”隔开多个点对于腾讯地图、谷歌地图和高德地图整个coordinatePoints的长度必须小于2k对于百度地图整个coordinatePoints的长度必须小于1k
CloseStatus int `json:"closeStatus,omitempty"`
StoreNotice string `json:"storeNotice,omitempty"`
StandByPhone string `json:"standByPhone,omitempty"`
}
type StoreDetail struct {
// 以下可用于修改(及查询)
StationNo string `json:"stationNo"` // 强制参数,主键
StationName string `json:"stationName,omitempty"`
OutSystemID string `json:"outSystemId,omitempty"`
Mobile string `json:"mobile,omitempty"`
Phone string `json:"phone,omitempty"`
Lat float64 `json:"lat,omitempty"`
Lng float64 `json:"lng,omitempty"`
City int `json:"city,omitempty"`
County int `json:"county,omitempty"`
StationAddress string `json:"stationAddress,omitempty"`
// Operator string `json:"operator"` // 返回值无
ServiceTimeEnd1 int `json:"serviceTimeEnd1,omitempty"`
ServiceTimeStart1 int `json:"serviceTimeStart1,omitempty"`
ServiceTimeEnd2 int `json:"serviceTimeEnd2,omitempty"`
ServiceTimeStart2 int `json:"serviceTimeStart2,omitempty"`
// DeliveryRangeType int8 `json:"deliveryRangeType,omitempty"` // 返回值无划分配送服务范围的类型3、圆心半径、2、不规则多边形手动画范围。若更新此字段需传完整值。
// CoordinateType int `json:"coordinateType,omitempty"` // 返回值无,使用的地图类型(1,谷歌), (2,百度), (3,高德), (4,腾讯)
// DeliveryRangeRadius int `json:"deliveryRangeRadius,omitempty"` // 返回值无,时效服务范围半径(单位:米)如果服务范围为类型3的话该字段有值
// CoordinatePoints string `json:"coordinatePoints,omitempty"` // 返回值无坐标点集合如果服务范围为类型2的话该字段有值每个点以经度,纬度 的格式表示,用“;”隔开多个点对于腾讯地图、谷歌地图和高德地图整个coordinatePoints的长度必须小于2k对于百度地图整个coordinatePoints的长度必须小于1k
CloseStatus int `json:"closeStatus,omitempty"`
StoreNotice string `json:"storeNotice,omitempty"`
StandByPhone string `json:"standByPhone,omitempty"`
// 以下仅用于查询
AllowRangeOptimized int `json:"allowRangeOptimized,omitempty"`
CacheKey4StoreList string `json:"cacheKey4StoreList,omitempty"`
CarrierNo int `json:"carrierNo,omitempty"`
CityName string `json:"cityName,omitempty"`
Coordinate string `json:"coordinate,omitempty"`
CoordinateAddress string `json:"coordinateAddress,omitempty"`
CountyName string `json:"countyName,omitempty"`
CreatePin string `json:"createPin,omitempty"`
CreateTime *utils.JavaDate `json:"createTime,omitempty"`
ID int64 `json:"id,omitempty"`
IndustryTag int `json:"industryTag,omitempty"`
InnerNoStatus int `json:"innerNoStatus,omitempty"`
IsAutoOrder int `json:"isAutoOrder,omitempty"` // 是否自动接单0:是1:否
IsMembership int `json:"isMembership,omitempty"`
IsNoPaper int `json:"isNoPaper,omitempty"`
OnlineTime *utils.JavaDate `json:"onlineTime,omitempty"`
OrderAging int `json:"orderAging,omitempty"`
OrderNoticeType int `json:"orderNoticeType,omitempty"`
PreWarehouse int `json:"preWarehouse,omitempty"`
Province int `json:"province,omitempty"`
ProvinceName string `json:"provinceName,omitempty"`
QualifyStatus int `json:"qualifyStatus,omitempty"`
RegularFlag int `json:"regularFlag,omitempty"`
StationDeliveryStatus int `json:"stationDeliveryStatus,omitempty"`
SupportInvoice int `json:"supportInvoice,omitempty"`
SupportOfflinePurchase int `json:"supportOfflinePurchase,omitempty"`
TestMark int `json:"testMark,omitempty"`
TimeAmType int `json:"timeAmType,omitempty"`
TimePmType int `json:"timePmType,omitempty"`
Ts *utils.JavaDate `json:"ts,omitempty"`
UpdatePin string `json:"updatePin,omitempty"`
UpdateTime *utils.JavaDate `json:"updateTime,omitempty"`
VenderID string `json:"venderId,omitempty"`
VenderName string `json:"venderName,omitempty"`
WareType int `json:"wareType,omitempty"`
WhiteDelivery bool `json:"whiteDelivery,omitempty"`
Yn int8 `json:"yn,omitempty"` // 门店状态,0启用,1禁用
}
type OrderProdCommentVo struct {
CreatePin string `json:"createPin"`
CreateTime *utils.JavaDate `json:"createTime"`
ID int64 `json:"id"`
IsPraise int `json:"isPraise"`
Score int `json:"score"`
ScoreLevel int `json:"scoreLevel"`
SkuID int64 `json:"skuId"`
SkuName string `json:"skuName"`
UpdatePin string `json:"updatePin"`
UpdateTime *utils.JavaDate `json:"updateTime"`
Yn int8 `json:"yn"`
}
type OrderCommentInfo struct {
AppVersion string `json:"appVersion"`
CreatePin string `json:"createPin"`
CreateTime *utils.JavaDate `json:"createTime"`
DeliveryCarrierNo string `json:"deliveryCarrierNo"`
DeliveryConfirmTime *utils.JavaDate `json:"deliveryConfirmTime"`
DeliveryConfirmTime2 *utils.JavaDate `json:"deliveryConfirmTime2"`
DeliveryDifTime int `json:"deliveryDifTime"`
DeliveryDifTime2 int `json:"deliveryDifTime2"`
DeliveryManNo string `json:"deliveryManNo"`
DocID interface{} `json:"docId"`
ID int64 `json:"id"`
IsUpdate int `json:"isUpdate"`
OrderID int64 `json:"orderId"`
OrderProdCommentVoList []*OrderProdCommentVo `json:"orderProdCommentVoList"`
OrderType int `json:"orderType"`
OrgCode int `json:"orgCode"`
OrgCommentContent string `json:"orgCommentContent"`
OrgCommentStatus int `json:"orgCommentStatus"`
OrgCommentTime *utils.JavaDate `json:"orgCommentTime"`
OrgName string `json:"orgName"`
Score3 int `json:"score3"`
Score3Content string `json:"score3Content"`
Score4 int `json:"score4"`
Score4Content string `json:"score4Content"`
ScoreLevel int `json:"scoreLevel"`
StoreID int `json:"storeId"`
StoreName string `json:"storeName"`
Tags []string `json:"tags"`
TagsKey []string `json:"tagsKey"`
UpdatePin string `json:"updatePin"`
UpdateTime *utils.JavaDate `json:"updateTime"`
VenderTageKey []string `json:"venderTageKey"`
VenderTags []string `json:"venderTags"`
Yn int8 `json:"yn"`
}
type StoreDeliveryRange struct {
Adresses string `json:"adresses"`
CreatePin string `json:"createPin"`
CreateTime *utils.JavaDate `json:"createTime"`
DeliveryRange string `json:"deliveryRange"`
DeliveryRangeRadius int `json:"deliveryRangeRadius"`
DeliveryRangeType int `json:"deliveryRangeType"`
DeliveryServiceType int `json:"deliveryServiceType"`
ID int `json:"id"`
StationNo string `json:"stationNo"`
Ts *utils.JavaDate `json:"ts"`
UpdatePin string `json:"updatePin"`
UpdateTime *utils.JavaDate `json:"updateTime"`
VenderID string `json:"venderId"`
Yn int8 `json:"yn"`
}
func (a *API) GetAllCities() (cities []*CityInfo, err error) {
result, err := a.AccessAPINoPage("address/allcities", nil, nil, nil, genNoPageResultParser("code", "msg", "result", "0"))
@@ -75,23 +234,8 @@ func (a *API) GetStationsByVenderId() ([]string, error) {
// 新增不带资质的门店信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=194&apiid=93acef27c3aa4d8286d5c8c26b493629
func (a *API) CreateStore(stationName, phone string, city, county int, stationAddress, userName string, serviceTimeStart1, serviceTimeEnd1 int, lng, lat float64, deliveryRangeType, coordinateType int, standByPhone string, addParams map[string]interface{}) (*CreateShopResult, error) {
params := map[string]interface{}{
KeyStationName: stationName,
KeyPhone: phone,
KeyCity: city,
KeyCounty: county,
KeyStationAddress: stationAddress,
KeyOperator: utils.GetAPIOperator(userName),
KeyServiceTimeStart1: serviceTimeStart1,
KeyServiceTimeEnd2: serviceTimeEnd1,
KeyLng: lng,
KeyLat: lat,
KeyDeliveryRangeType: deliveryRangeType,
KeyCoordinateType: coordinateType,
KeyStandByPhone: standByPhone,
}
result, err := a.AccessAPINoPage("store/createStore", utils.MergeMaps(params, addParams), nil, nil, func(data map[string]interface{}) (interface{}, error) {
func (a *API) CreateStore(createParams *OpStoreParams) (*CreateShopResult, error) {
result, err := a.AccessAPINoPage("store/createStore", utils.Struct2MapByJson(createParams), nil, nil, func(data map[string]interface{}) (interface{}, error) {
innerCode := data["code"].(string)
if data["code"] == "0" {
mapData := data["data"].(map[string]interface{})
@@ -116,6 +260,14 @@ func (a *API) GetStoreInfoByStationNo(storeNo string) (map[string]interface{}, e
return nil, err
}
func (a *API) GetStoreInfoByStationNo2(storeNo string) (storeDetail *StoreDetail, err error) {
result, err := a.AccessAPINoPage("storeapi/getStoreInfoByStationNo", utils.Params2Map("StoreNo", storeNo), nil, nil, nil)
if err == nil {
err = utils.Map2StructByJson(result, &storeDetail, false)
}
return storeDetail, err
}
// 修改门店基础信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=194&apiid=2600369a456446f0921e918f3d15e96a
func (a *API) UpdateStoreInfo4Open(storeNo, userName string, addParams map[string]interface{}) error {
@@ -128,6 +280,11 @@ func (a *API) UpdateStoreInfo4Open(storeNo, userName string, addParams map[strin
return err
}
func (a *API) UpdateStoreInfo4Open2(updateParams *OpStoreParams) (err error) {
_, err = a.AccessAPINoPage("store/updateStoreInfo4Open", utils.Struct2MapByJson(updateParams), nil, nil, nullResultParser)
return err
}
// 根据订单号查询商家门店评价信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=194&apiid=bd23397725bb4e74b69e2f2fa1c88d43
func (a *API) GetCommentByOrderId(orderId int64) (map[string]interface{}, error) {
@@ -141,6 +298,17 @@ func (a *API) GetCommentByOrderId(orderId int64) (map[string]interface{}, error)
return nil, err
}
func (a *API) GetCommentByOrderId2(orderId int64) (orderComment *OrderCommentInfo, err error) {
jdParams := map[string]interface{}{
"orderId": orderId,
}
result, err := a.AccessAPINoPage("commentOutApi/getCommentByOrderId", jdParams, nil, nil, genNoPageResultParser("code", "msg", "result", "200"))
if err == nil {
err = utils.Map2StructByJson(result, &orderComment, false)
}
return orderComment, err
}
// 商家门店评价信息回复接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=194&apiid=ea0b466a7fa8489b813e8b197efca2d4
func (a *API) OrgReplyComment(orderID int64, storeID, content, replayPin string) error {
@@ -186,6 +354,17 @@ func (a *API) GetDeliveryRangeByStationNo(stationNo string) (map[string]interfac
return nil, err
}
func (a *API) GetDeliveryRangeByStationNo2(stationNo string) (deliveryRange *StoreDeliveryRange, err error) {
jdParams := map[string]interface{}{
"stationNo": stationNo,
}
result, err := a.AccessAPINoPage("store/getDeliveryRangeByStationNo", jdParams, nil, nil, nil)
if err == nil {
err = utils.Map2StructByJson(result, &deliveryRange, false)
}
return deliveryRange, err
}
// 私有函数
func interface2CreateShopResult(data interface{}) (retVal *CreateShopResult) {
if result, ok := data.(map[string]interface{}); ok {

View File

@@ -11,6 +11,9 @@ import (
const (
mustExistStoreID = "11053496"
mustExistStoreJXID = "2"
// mustExistStoreID = "11734851"
// mustExistStoreJXID = "100118"
)
func TestGetAllCities(t *testing.T) {
@@ -39,56 +42,51 @@ func TestGetStationsByVenderId(t *testing.T) {
}
func TestGetStoreInfoByStationNo(t *testing.T) {
result, err := api.GetStoreInfoByStationNo(mustExistStoreID)
result, err := api.GetStoreInfoByStationNo2(mustExistStoreID)
if err != nil {
t.Fatal(err)
}
outSystemId := result["outSystemId"].(string)
if outSystemId != "100285" {
baseapi.SugarLogger.Fatalf("outSystemId is not correct, its:%s", outSystemId)
t.Log(utils.Format4Output(result, false))
if result.OutSystemID != mustExistStoreJXID {
baseapi.SugarLogger.Fatalf("outSystemId is not correct, its:%s", result.OutSystemID)
}
}
func TestUpdateStoreInfo4Open(t *testing.T) {
result, err := api.GetStoreInfoByStationNo(mustExistStoreID)
result, err := api.GetStoreInfoByStationNo2(mustExistStoreID)
if err != nil {
t.Fatal(err)
}
oldAddress := result["stationAddress"].(string)
testAddress := oldAddress + "T"
addParams := map[string]interface{}{
"stationAddress": testAddress,
oldAddress := result.StationAddress
params := &OpStoreParams{
StationNo: mustExistStoreID,
Operator: "test",
StationAddress: oldAddress + "T",
}
err = api.UpdateStoreInfo4Open(mustExistStoreID, "test", addParams)
err = api.UpdateStoreInfo4Open2(params)
if err != nil {
t.Fatal(err)
}
result, err = api.GetStoreInfoByStationNo(mustExistStoreID)
newAddress := result["stationAddress"].(string)
if newAddress != testAddress {
result, err = api.GetStoreInfoByStationNo2(mustExistStoreID)
newAddress := result.StationAddress
if newAddress != params.StationAddress {
t.Fatalf("address not match, newAddress:%s, oldAddress:%s", newAddress, oldAddress)
}
addParams = map[string]interface{}{
"stationAddress": oldAddress,
}
api.UpdateStoreInfo4Open(mustExistStoreID, "test", addParams)
params.StationAddress = oldAddress
api.UpdateStoreInfo4Open2(params)
if err != nil {
t.Fatal(err)
}
}
func TestGetCommentByOrderId(t *testing.T) {
testOrderID := int64(822347450000922)
result, err := api.GetCommentByOrderId(testOrderID)
testOrderID := int64(922520919000622)
result, err := api.GetCommentByOrderId2(testOrderID)
if err != nil {
t.Fatal(err.Error())
}
gotOrderID := utils.MustInterface2Int64(result["orderId"])
if gotOrderID != testOrderID {
t.Fatalf("GetCommentByOrderId wrong, gotOrderID:%d", gotOrderID)
}
t.Log(utils.Format4Output(result, false))
}
@@ -115,27 +113,27 @@ func TestUpdateStoreConfig4Open(t *testing.T) {
}
func TestGetDeliveryRangeByStationNo(t *testing.T) {
const testStoreID = "11738152"
result, err := api.GetDeliveryRangeByStationNo(testStoreID)
if err != nil {
t.Fatal(err)
}
result2, err := api.GetStoreInfoByStationNo(testStoreID)
const testStoreID = "11734851"
result, err := api.GetDeliveryRangeByStationNo2(testStoreID)
if err != nil {
t.Fatal(err)
}
baseapi.SugarLogger.Debug(utils.Format4Output(result, false))
baseapi.SugarLogger.Debug(utils.Format4Output(result2, false))
deliveryRange := result["deliveryRange"].(string)
params := map[string]interface{}{
"lng": result2["lng"],
"lat": result2["lat"],
"coordinateType": 3,
"deliveryRangeType": 2,
"coordinatePoints": deliveryRange,
}
err = api.UpdateStoreInfo4Open(testStoreID, "test", params)
}
func TestDisableAutoOrder4AllStores(t *testing.T) {
storeIDs, err := api.GetStationsByVenderId()
if err != nil {
t.Fatal(err)
}
for _, storeID := range storeIDs {
if storeInfo, err := api.GetStoreInfoByStationNo2(storeID); err == nil {
if storeInfo.Yn == 0 && storeInfo.IsAutoOrder == 0 {
t.Log(storeID)
api.UpdateStoreConfig4Open(storeID, false)
}
t.Log(utils.Format4Output(storeInfo, false))
}
break
}
}