Files
baseapi/platformapi/jdapi/sku.go
2018-09-05 16:18:31 +08:00

406 lines
14 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package jdapi
import (
"git.rosy.net.cn/baseapi/utils"
)
const (
KeyBrandId = "brandId"
KeyBrandName = "brandName"
KeyBrandStatus = "brandStatus"
KeyCategoryId = "categoryId"
KeyChildIds = "childIds"
KeyFields = "fields"
KeyFixedStatus = "fixedStatus"
KeyHandleStatus = "handleStatus"
KeyHeight = "height"
KeyID = "id"
KeyImages = "images"
KeyImgType = "imgType"
KeyIfViewDesc = "ifViewDesc"
KeyIsFilterDel = "isFilterDel"
KeyIsSale = "isSale"
KeyKeyValue = "keyValue"
KeyLength = "length"
KeyLiquidStatue = "liquidStatue"
KeyOutSkuId = "outSkuId"
KeyPID = "pid"
KeyProductDesc = "productDesc"
KeyPageNo = "pageNo"
KeyPageSize = "pageSize"
KeyPrefixKey = "prefixKey"
KeyPrefixKeyId = "prefixKeyId"
KeyPreKeyEndTime = "preKeyEndTime"
KeyPreKeyStartTime = "preKeyStartTime"
KeyPrescripition = "prescripition"
KeyShopCategoryLevel = "shopCategoryLevel"
KeyShopCategoryName = "shopCategoryName"
KeyShopCategories = "shopCategories"
KeySellCities = "sellCities"
KeySlogan = "slogan"
KeySloganEndTime = "sloganEndTime"
KeySloganStartTime = "sloganStartTime"
KeySort = "sort"
KeySkuId = "skuId"
KeySkuName = "skuName"
KeySkuPrice = "skuPrice"
KeyStoreId = "storeId"
KeySystemFixedStatus = "systemFixedStatus"
KeyTransportAttribute = "transportAttribute"
KeyUpcCode = "upcCode"
KeyWeight = "weight"
)
type SkuIDPair struct {
SkuId int64 `json:"skuId"`
OutSkuId string `json:"outSkuId"`
}
type BrandInfo struct {
ID int `json:"id"`
BrandName string `json:"brandName"`
BrandStatus int `json:"brandStatus"`
}
type IDKeyValuePair struct {
ID string `json:"_id"`
KeyValue string `json:"keyValue"`
}
type ProductStatus struct {
Synchronized bool `json:"synchronized"`
EsEntity map[string]interface{} `json:"esEntity"`
ProductEntity map[string]interface{} `json:"productEntity"`
}
// 这个类型商家店内分类与到家分类共用,
type CategoryInfo struct {
Id int64 `json:"id"`
ParentId int64 `json:"pid"`
Name string `json:"categoryName"`
Level int `json:"categoryLevel"`
Sort int `json:"sort"` // 店内分类独有
Status int `json:"status"` // 到家分类独有
FullPath string `json:"fullPath"` // 到家分类独有
}
// 分页查询商品品牌信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=1ca07a3e767649a7a44fc6ea7e9ed8dd
func (a *API) QueryPageBrandInfo(pageNo, pageSize, brandId int, brandName string) (brandList []*BrandInfo, totalCount int, err error) {
if pageNo <= 0 {
pageNo = 1
}
if pageSize == 0 {
pageSize = 50
}
params := map[string]interface{}{
KeyPageNo: pageNo, // pageNo好像必须要有值否则一直不返回
KeyPageSize: pageSize,
KeyFields: []string{
"BRAND_ID",
"BRAND_NAME",
"BRAND_STATUS",
},
}
if brandId != 0 {
params[KeyBrandId] = brandId
}
if brandName == "" {
params[KeyBrandName] = brandName
}
result, totalCount, err := a.AccessAPIHavePage("pms/queryPageBrandInfo", params, nil, nil, nil)
if err == nil {
brandList = make([]*BrandInfo, len(result))
for index, v := range result {
mapData := v.(map[string]interface{})
brandList[index] = &BrandInfo{
ID: int(utils.MustInterface2Int64(mapData[KeyID])),
BrandName: utils.Interface2String(mapData[KeyBrandName]),
BrandStatus: int(utils.MustInterface2Int64(mapData[KeyBrandStatus])),
}
}
return brandList, totalCount, nil
}
return nil, 0, err
}
// 获取京东到家类目信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=d287d326124d42c090cff03c16385706
func (a *API) QueryChildCategoriesForOP(pid int64) (catList []*CategoryInfo, err error) {
result, err := a.AccessAPINoPage("api/queryChildCategoriesForOP", utils.Params2Map("fields", []string{
"ID",
"PID",
"CATEGORY_NAME",
"CATEGORY_LEVEL",
"CATEGORY_STATUS",
"FULLPATH",
}, "id", pid), nil, nil, nil)
if err == nil {
return interface2CatList(result, 1, func(data interface{}, level int) (cat *CategoryInfo) {
mapData, ok := data.(map[string]interface{})
if ok {
cat = &CategoryInfo{
Id: utils.MustInterface2Int64(mapData["id"]),
ParentId: utils.MustInterface2Int64(mapData["pid"]),
Name: utils.Interface2String(mapData["categoryName"]),
Level: int(utils.MustInterface2Int64(mapData["categoryLevel"])),
Status: int(utils.MustInterface2Int64(mapData["categoryStatus"])),
FullPath: utils.Interface2String(mapData["fullPath"]),
}
}
return cat
}), nil
}
return nil, err
}
// 新增商家店内分类信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=de26f24a62aa47a49e5ab7579d638cb3
func (a *API) AddShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) {
params := map[string]interface{}{
KeyPID: pid,
KeyShopCategoryName: shopCategoryName,
KeyShopCategoryLevel: shopCategoryLevel,
KeySort: sort,
"createPin": utils.GetAPIOperator(userName),
}
result, err := a.AccessAPINoPage("pms/addShopCategory", params, nil, nil, nil)
if err == nil {
return (result.(map[string]interface{}))["id"].(string), nil
}
return "", err
}
// 查询商家店内分类信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=964f2d248a7e42b196be2ab35b4e93b4
func (a *API) QueryCategoriesByOrgCode() (catList []*CategoryInfo, err error) {
result, err := a.AccessAPINoPage("pms/queryCategoriesByOrgCode", utils.Params2Map("fields", []string{
"ID",
"PID",
"SHOP_CATEGORY_NAME",
"SORT",
}), nil, nil, nil)
if err == nil {
return interface2CatList(result, 1, nil), nil
}
return nil, err
}
// 修改商家店内分类信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=1de278c670b64da492f676ab78d62f73
func (a *API) UpdateShopCategory(id int64, shopCategoryName string) error {
params := map[string]interface{}{
KeyID: id,
KeyShopCategoryName: shopCategoryName,
}
_, err := a.AccessAPINoPage("pms/updateShopCategory", params, nil, nil, nullResultParser)
return err
}
// 修改商家店内分类顺序接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=2a8267602e814be9828f0c7ce307b872
func (a *API) ChangeShopCategoryOrder(pid int64, childIds []int) error {
params := map[string]interface{}{
KeyPID: pid,
KeyChildIds: childIds,
}
_, err := a.AccessAPINoPage("pms/changeShopCategoryOrder", params, nil, nil, nullResultParser)
return err
}
// 删除商家店内分类接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=c17b96e9fe254b2a8574f6d1bc0c1667
func (a *API) DelShopCategory(id int64) error {
_, err := a.AccessAPINoPage("pms/delShopCategory", utils.Params2Map(KeyID, id), nil, nil, nullResultParser)
return err
}
// 新增商品信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=dfe6a5ca73fa421da1c9f969b848113e
func (a *API) AddSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) {
fixedParams := map[string]interface{}{
KeyOutSkuId: outSkuId,
KeyCategoryId: cagtegoryId,
KeyShopCategories: shopCategories,
KeyBrandId: brandId,
KeySkuName: skuName,
KeySkuPrice: skuPrice,
KeyWeight: weight,
KeyImages: images,
KeyFixedStatus: fixedStatus,
KeyIsSale: isSale,
}
result, err := a.AccessAPINoPage("pms/sku/addSku", utils.MergeMaps(fixedParams, addParams), nil, nil, nil)
if err == nil {
return (result.(map[string]interface{}))["skuId"].(string), nil
}
return "", err
}
// 根据商家商品编码修改商品信息接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=290bdb0ea8a44e10b86b05591254ad68
func (a *API) UpdateSku(outSkuId string, params map[string]interface{}) (skuId string, err error) {
result, err := a.AccessAPINoPage("pms/sku/updateSku", utils.MergeMaps(params, utils.Params2Map("outSkuId", outSkuId)), nil, nil, nil)
if err == nil {
return (result.(map[string]interface{}))["skuId"].(string), nil
}
return "", err
}
// 根据到家商品编码批量更新商家商品编码接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=4155d29bbdf649b69c67473b705ce7e7
func (a *API) BatchUpdateOutSkuId(skuInfoList []*SkuIDPair) (retVal interface{}, err error) {
result, err := a.AccessAPINoPage("pms/sku/batchUpdateOutSkuId", utils.Params2Map("skuInfoList", skuInfoList), nil, nil, nil)
if err == nil {
return result, nil
}
return nil, err
}
// 查询商家已上传商品信息列表接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=e433b95f74524dab91718432c0358977
// pageNo 从1开始
func (a *API) QuerySkuInfos(skuName string, skuId, pageNo, pageSize int, isFilterDel bool) (retVal []map[string]interface{}, totalCount int, err error) {
if pageNo <= 0 {
pageNo = 1
}
if pageSize == 0 {
pageSize = 50
}
params := map[string]interface{}{
KeyPageNo: pageNo, // pageNo好像必须要有值否则一直不返回
KeyPageSize: pageSize,
}
if skuName != "" {
params[KeySkuName] = skuName
}
if skuId != 0 {
params[KeySkuId] = skuId
}
if isFilterDel {
params[KeyIsFilterDel] = "1"
} else {
params[KeyIsFilterDel] = "0"
}
result, totalCount, err := a.AccessAPIHavePage("pms/querySkuInfos", params, nil, nil, nil)
if err == nil {
return utils.Slice2MapSlice(result), totalCount, nil
}
return nil, 0, err
}
// 查询商品图片处理结果接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=17506653e03542f9a49023711780c30d
func (a *API) QueryListBySkuIds(skuIds []int64, addParams map[string]interface{}) (retVal []map[string]interface{}, err error) {
result, err := a.AccessAPINoPage("order/queryListBySkuIds", utils.MergeMaps(addParams, utils.Params2Map("skuIds", skuIds)), nil, nil, nil)
if err == nil {
return utils.Slice2MapSlice(result.([]interface{})), nil
}
return nil, err
}
// 分页查询京东到家商品前缀库接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=2195b87baf0c4783bb1a4fda35aea7d1
func (a *API) QueryKeyWordDicInfo(pageNo, pageSize int, keyValue string) (values []*IDKeyValuePair, totalCount int, err error) {
if pageNo <= 0 {
pageNo = 1
}
if pageSize == 0 {
pageSize = 50
}
params := map[string]interface{}{
KeyPageNo: pageNo, // pageNo好像必须要有值否则一直不返回
KeyPageSize: pageSize,
KeyFields: []string{
"ID",
"KEYVALUE",
},
}
if keyValue != "" {
params[KeyKeyValue] = keyValue
}
result, totalCount, err := a.AccessAPIHavePage("pms/queryKeyWordDicInfo", params, nil, nil, nil)
if err == nil {
values = make([]*IDKeyValuePair, len(result))
for index, v := range result {
mapData := v.(map[string]interface{})
values[index] = &IDKeyValuePair{
ID: utils.Interface2String(mapData["_id"]),
KeyValue: utils.Interface2String(mapData[KeyKeyValue]),
}
}
return values, totalCount, nil
}
return nil, 0, err
}
// 商家商品状态同步接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=5e29d6c9317847e58b8cbcc70702fd52
func (a *API) SyncProduct(storeId, skuId string) (retVal bool, err error) {
result, err := a.AccessAPINoPage("search/syncProduct", utils.Params2Map(KeyStoreId, storeId, KeySkuId, skuId), nil, nil, func(data map[string]interface{}) (interface{}, error) {
status := utils.MustInterface2Int64(data["status"])
if status == 200 {
return data["synchronized"].(bool), nil
}
return nil, utils.NewErrorIntCode(data["message"].(string), int(status))
})
if err == nil {
return result.(bool), nil
}
return false, err
}
// 商家商品状态检查接口
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=a348122182ef459982cae1280407ff17
func (a *API) GetProductStatus(storeId, skuId string) (retVal *ProductStatus, err error) {
result, err := a.AccessAPINoPage("search/getProductStatus", utils.Params2Map(KeyStoreId, storeId, KeySkuId, skuId), nil, nil, func(data map[string]interface{}) (interface{}, error) {
status := utils.MustInterface2Int64(data["status"])
if status == 200 {
return &ProductStatus{
Synchronized: data["synchronized"].(bool),
EsEntity: data["esEntity"].(map[string]interface{}),
ProductEntity: data["productEntity"].(map[string]interface{}),
}, nil
}
return nil, utils.NewErrorIntCode(data["message"].(string), int(status))
})
if err == nil {
return result.(*ProductStatus), nil
}
return nil, err
}
///////////////////////////
// 私有辅助函数
func interface2Cat(data interface{}, level int) (cat *CategoryInfo) {
mapData, ok := data.(map[string]interface{})
if ok {
cat = &CategoryInfo{
Id: utils.MustInterface2Int64(mapData["id"]),
ParentId: utils.MustInterface2Int64(mapData["pid"]),
Name: utils.Interface2String(mapData["shopCategoryName"]),
Level: int(utils.Interface2Int64WithDefault(mapData["shopCategoryLevel"], 0)),
Sort: int(utils.MustInterface2Int64(mapData["sort"])),
}
}
return cat
}
func interface2CatList(data interface{}, level int, interface2CatHandler func(data interface{}, level int) (cat *CategoryInfo)) (cats []*CategoryInfo) {
if interface2CatHandler == nil {
interface2CatHandler = interface2Cat
}
maps, ok := data.([]interface{})
if ok {
cats = make([]*CategoryInfo, len(maps))
for index, v := range maps {
cats[index] = interface2CatHandler(v, level)
}
}
return cats
}