diff --git a/platformapi/elmapi/callback.go b/platformapi/elmapi/callback.go index 05737a95..5f764fd6 100644 --- a/platformapi/elmapi/callback.go +++ b/platformapi/elmapi/callback.go @@ -133,7 +133,7 @@ type CallbackOrderUrgeMsg struct { OrderID string `json:"orderId"` ShopID int `json:"shopId"` RemindID int `json:"remindId"` - UserID int `json:"userId"` + UserID int64 `json:"userId"` UpdateTime int64 `json:"updateTime"` // 秒 MsgType int `json:"-"` // 用于传递msg type,不是真正消息的一部分 } diff --git a/platformapi/elmapi/product.go b/platformapi/elmapi/product.go new file mode 100644 index 00000000..ee06f631 --- /dev/null +++ b/platformapi/elmapi/product.go @@ -0,0 +1,455 @@ +package elmapi + +import ( + "git.rosy.net.cn/baseapi/utils" +) + +const ( + CategoryTypeNormal = "NORMAL" + CategoryTypeRequired = "REQUIRED" + CategoryTypeIndependent = "INDEPENDENT" +) + +const ( + MaxPageSize = 300 +) + +// 这个类型商家店内分类与饿了么分类共用, +type CategoryInfo struct { + Id int64 `json:"id"` + Name string `json:"name"` + Description string `json:"description"` // 店内分类独有 + IsValid bool `json:"isValid"` // 店内分类独有 + ParentId int64 `json:"parentId"` + CategoryType string `json:"categoryType"` // 店内分类独有 + Level int `json:"level"` // 饿了么分类独有 + IsLeaf bool `json:"isLeaf"` // 饿了么分类独有 + Children []*CategoryInfo `json:"children"` +} + +type CategorySortInfo struct { + ParentId int64 `json:"parentId"` + ChildrenIDs []int `json:"childrenIds"` +} + +type OItemIdWithSpecIds struct { + ItemId int64 `json:"itemId"` + ItemSpecIds []int64 `json:"itemSpecIds"` +} + +type OBatchModifiedFailure struct { + Id int64 `json:"id"` + Code string `json:"code"` + Description string `json:"description"` +} + +const ( + IdTypeItem = "ITEM_ID" + IdTypeSpec = "SPEC_ID" + IdTypeCategory = "CATEGORY_ID" +) + +type OBatchModifiedResult struct { + Type string `json:"type"` + Modifications []int64 `json:"modifications"` + Failures []*OBatchModifiedFailure `json:"failures"` +} + +type OItemIdWithSpecPrice struct { + ItemId int64 `json:"itemId"` + PriceMap map[string]float64 `json:"priceMap"` +} + +// 查询店铺商品分类,包含二级分类 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-getShopCategoriesWithChildren +func (a *API) GetShopCategoriesWithChildren(shopId int) ([]*CategoryInfo, error) { + result, err := a.AccessAPI("eleme.product.category.getShopCategoriesWithChildren", utils.Params2Map(KeyShopID, shopId)) + if err == nil { + return interface2CatList(result.Result, 1, nil), nil + } + return nil, err +} + +// 查询商品分类详情,包含二级分类 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-getCategoryWithChildren +func (a *API) GetCategoryWithChildren(categoryId int64) (*CategoryInfo, error) { + result, err := a.AccessAPI("eleme.product.category.getCategoryWithChildren", utils.Params2Map("categoryId", categoryId)) + if err == nil { + return interface2Cat(result.Result, 1), nil + } + return nil, err +} + +// 添加商品分类,支持二级分类 +// parentID小于0表示忽略? +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-createCategoryWithChildren +func (a *API) CreateCategoryWithChildren(shopId int, parentId int64, name, description string) (*CategoryInfo, error) { + params := map[string]interface{}{ + KeyShopID: shopId, + "name": name, + } + if parentId >= 0 { + params["parentId"] = parentId + } + if description != "" { + params["description"] = description + } + result, err := a.AccessAPI("eleme.product.category.createCategoryWithChildren", params) + if err == nil { + return interface2Cat(result.Result, 1), nil + } + return nil, err +} + +// 更新商品分类,包含二级分类 +// parentID小于0表示忽略? +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-updateCategoryWithChildren +func (a *API) UpdateCategory(shopId int, parentId int64, name, description string) (*CategoryInfo, error) { + params := map[string]interface{}{ + KeyShopID: shopId, + "name": name, + } + if parentId >= 0 { + params["parentId"] = parentId + } + if description != "" { + params["description"] = description + } + result, err := a.AccessAPI("eleme.product.category.updateCategory", params) + if err == nil { + return interface2Cat(result.Result, 1), nil + } + return nil, err +} + +// 删除商品分类(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-invalidCategory +func (a *API) InvalidCategory(categoryId int64) error { + _, err := a.AccessAPI("eleme.product.category.invalidCategory", utils.Params2Map("categoryId", categoryId)) + return err +} + +// 设置二级分类排序 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-setCategoryPositionsWithChildren +func (a *API) setCategoryPositionsWithChildren(shopId int, categoryWithChildrenIds []*CategorySortInfo) error { + _, err := a.AccessAPI("eleme.product.category.setCategoryPositionsWithChildren", utils.Params2Map(KeyShopID, shopId, "categoryWithChildrenIds", categoryWithChildrenIds)) + return err +} + +// 设置分类排序(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-setCategorySequence +func (a *API) setCategorySequence(shopId int, categoryIds []int64) error { + _, err := a.AccessAPI("eleme.product.category.setCategorySequence", utils.Params2Map(KeyShopID, shopId, "categoryIds", categoryIds)) + return err +} + +// 查询商品后台类目 +// 注意,这个是饿了么的商品分类,不是商家商品分类 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-getBackCategory +func (a *API) GetBackCategory(shopId int) ([]*CategoryInfo, error) { + result, err := a.AccessAPI("eleme.product.category.getBackCategory", utils.Params2Map(KeyShopID, shopId)) + if err == nil { + return interface2CatList(result.Result, 1, func(data interface{}, level int) (cat *CategoryInfo) { + mapData, ok := data.(map[string]interface{}) + if ok { + cat = &CategoryInfo{ + Id: utils.MustInterface2Int64(mapData["id"]), + Name: utils.Interface2String(mapData["name"]), + ParentId: utils.MustInterface2Int64(mapData["parentId"]), + Level: int(utils.MustInterface2Int64(mapData["lev"])), + IsLeaf: mapData["leaf"].(bool), + } + } + return cat + }), nil + } + return nil, err +} + +// 设置分类类型 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-category-setCategoryType +func (a *API) setCategoryType(shopId int, categoryId int64, categoryType string) error { + params := map[string]interface{}{ + KeyShopID: shopId, + "categoryId": categoryId, + "categoryType": categoryType, + } + _, err := a.AccessAPI("eleme.product.category.setCategoryType", params) + return err +} + +// 获取一个分类下的所有商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-getItemsByCategoryId +func (a *API) GetItemsByCategoryId(categoryId int64) ([]map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.product.item.getItemsByCategoryId", utils.Params2Map("categoryId", categoryId)) + if err == nil { + return utils.MapKV2List(result.Result.(map[string]interface{})), nil + } + return nil, err +} + +// 查询商品详情 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-getItem +func (a *API) GetItem(itemId int64) (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.product.item.getItem", utils.Params2Map("itemId", itemId)) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 批量查询商品详情 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchGetItems +func (a *API) BatchGetItems(itemIds []int64) ([]map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.product.item.batchGetItems", utils.Params2Map("itemIds", itemIds)) + if err == nil { + return utils.MapKV2List(result.Result.(map[string]interface{})), nil + } + return nil, err +} + +// 添加商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-createItem +func (a *API) CreateItem(categoryId int64, properties map[string]interface{}) (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.product.item.createItem", utils.Params2Map("categoryId", categoryId, "properties", properties)) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 批量添加商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchCreateItems +func (a *API) BatchCreateItems(categoryId int64, items []map[string]interface{}) ([]map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.product.item.batchCreateItems", utils.Params2Map("categoryId", categoryId, "items", items)) + if err == nil { + return utils.Slice2MapSlice(result.Result.([]interface{})), nil + } + return nil, err +} + +// 更新商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-updateItem +func (a *API) UpdateItem(itemId, categoryId int64, properties map[string]interface{}) (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.product.item.updateItem", utils.Params2Map("itemId", itemId, "categoryId", categoryId, "properties", properties)) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 批量置满库存 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchFillStock +func (a *API) BatchFillStock(specIds []*OItemIdWithSpecIds) error { + _, err := a.AccessAPI("eleme.product.item.batchFillStock", utils.Params2Map("specIds", specIds)) + return err +} + +// 批量沽清库存 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchClearStock +func (a *API) BatchClearStock(specIds []*OItemIdWithSpecIds) error { + _, err := a.AccessAPI("eleme.product.item.batchClearStock", utils.Params2Map("specIds", specIds)) + return err +} + +// 批量上架商品(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchListItems +func (a *API) BatchListItems(itemIds []int64) (retVal *OBatchModifiedResult, err error) { + result, err := a.AccessAPI("eleme.product.item.batchListItems", utils.Params2Map("itemIds", itemIds)) + if err == nil { + return interface2OBatchModifiedResult(result.Result), nil + } + return nil, err +} + +// 批量下架商品(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchDelistItems +func (a *API) BatchDelistItems(itemIds []int64) (retVal *OBatchModifiedResult, err error) { + result, err := a.AccessAPI("eleme.product.item.batchDelistItems", utils.Params2Map("itemIds", itemIds)) + if err == nil { + return interface2OBatchModifiedResult(result.Result), nil + } + return nil, err +} + +// 删除商品(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-invalidItem +func (a *API) InvalidItem(itemId int64) error { + _, err := a.AccessAPI("eleme.product.item.invalidItem", utils.Params2Map("itemId", itemId)) + return err +} + +// 批量删除商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchRemoveItems +func (a *API) BatchRemoveItems(itemIds []int64) (retVal []map[string]interface{}, err error) { + result, err := a.AccessAPI("eleme.product.item.batchRemoveItems", utils.Params2Map("itemIds", itemIds)) + if err == nil { + return utils.MapKV2List(result.Result.(map[string]interface{})), nil + } + return nil, err +} + +// 批量更新商品库存(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchUpdateStock +func (a *API) BatchUpdateStock(itemIds []int64) (retVal *OBatchModifiedResult, err error) { + result, err := a.AccessAPI("eleme.product.item.batchUpdateStock", utils.Params2Map("itemIds", itemIds)) + if err == nil { + return interface2OBatchModifiedResult(result.Result), nil + } + return nil, err +} + +// 设置商品排序 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-setItemPositions +func (a *API) SetItemPositions(categoryId int64, itemIds []int64) error { + _, err := a.AccessAPI("eleme.product.item.setItemPositions", utils.Params2Map("categoryId", categoryId, "itemIds", itemIds)) + return err +} + +// 根据商品扩展码获取商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-getItemByShopIdAndExtendCode +func (a *API) GetItemByShopIdAndExtendCode(shopId int, extendCode string) (retVal map[string]interface{}, err error) { + result, err := a.AccessAPI("eleme.product.item.getItemByShopIdAndExtendCode", utils.Params2Map("shopId", shopId, "extendCode", extendCode)) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 批量修改商品价格 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-batchUpdatePrices +func (a *API) BatchUpdatePrices(shopId int, specPrices []*OItemIdWithSpecPrice) error { + _, err := a.AccessAPI("eleme.product.item.batchUpdatePrices", utils.Params2Map("shopId", shopId, "specPrices", specPrices)) + return err +} + +// 查询店铺活动商品(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-getShopSalesItems +func (a *API) GetShopSalesItems(shopId int) (retVal []int64, err error) { + result, err := a.AccessAPI("eleme.product.item.getShopSalesItems", utils.Params2Map("shopId", shopId)) + if err == nil { + ls := result.Result.([]interface{}) + retVal := make([]int64, len(ls)) + for index, v := range ls { + retVal[index] = utils.MustInterface2Int64(v) + } + return retVal, nil + } + return nil, err +} + +// 分页获取店铺下的商品 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-product-item-queryItemByPage +func (a *API) QueryItemByPage(shopId, offset, limit int) (retVal []map[string]interface{}, err error) { + if offset < 0 { + offset = 0 + } + if limit > MaxPageSize { + limit = MaxPageSize + } + result, err := a.AccessAPI("eleme.product.item.queryItemByPage", utils.Params2Map("queryPage", map[string]interface{}{ + "shopId": shopId, + "offset": offset, + "limit": limit, + })) + if err == nil { + return utils.Slice2MapSlice(result.Result.([]interface{})), nil + } + return nil, err +} + +// 上传图片,返回图片的hash值 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-file-uploadImage +func (a *API) UploadImage(base64Content string) (hashCode string, err error) { + result, err := a.AccessAPI("eleme.file.uploadImage", utils.Params2Map("image", base64Content)) + if err == nil { + return result.Result.(string), nil + } + return "", err +} + +// 通过远程URL上传图片,返回图片的hash值 +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-file-uploadImageWithRemoteUrl +func (a *API) UploadImageWithRemoteUrl(imgURL string) (hashCode string, err error) { + result, err := a.AccessAPI("eleme.file.uploadImageWithRemoteUrl", utils.Params2Map("url", imgURL)) + if err == nil { + return result.Result.(string), nil + } + return "", err +} + +// 获取上传图片的url地址(新版) +// https://open.shop.ele.me/openapi/apilist/eleme-product/eleme-file-getImageUrl +func (a *API) GetImageUrl(hashCode string) (imgURL string, err error) { + result, err := a.AccessAPI("eleme.file.getImageUrl", utils.Params2Map("hash", hashCode)) + if err == nil { + return result.Result.(string), nil + } + return "", err +} + +/////////////////////////// +// 私有辅助函数 +func interface2Cat(data interface{}, level int) (cat *CategoryInfo) { + mapData, ok := data.(map[string]interface{}) + if ok { + cat = &CategoryInfo{ + Id: utils.MustInterface2Int64(mapData["id"]), + Name: utils.Interface2String(mapData["name"]), + Description: utils.Interface2String(mapData["description"]), + ParentId: utils.MustInterface2Int64(mapData["parentId"]), + CategoryType: utils.Interface2String(mapData["categoryType"]), + Level: level, + IsLeaf: false, + } + if utils.MustInterface2Int64(mapData["isValid"]) != 0 { + cat.IsValid = true + } else { + cat.IsValid = false + } + cat.Children = interface2CatList(mapData["children"], level+1, interface2Cat) + if len(cat.Children) == 0 { + cat.IsLeaf = true + } + } + 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 +} + +func interface2OBatchModifiedResult(data interface{}) (retVal *OBatchModifiedResult) { + mapData := data.(map[string]interface{}) + retVal = &OBatchModifiedResult{ + Type: utils.Interface2String(mapData["type"]), + } + if modifications, ok := mapData["modifications"].([]interface{}); ok { + retVal.Modifications = make([]int64, len(modifications)) + for index, v := range modifications { + retVal.Modifications[index] = utils.MustInterface2Int64(v) + } + } + if failures, ok := mapData["failures"].([]interface{}); ok { + retVal.Failures = make([]*OBatchModifiedFailure, len(failures)) + for index, v := range failures { + mp := v.(map[string]interface{}) + retVal.Failures[index] = &OBatchModifiedFailure{ + Id: utils.MustInterface2Int64(mp["id"]), + Code: utils.Interface2String(mp["code"]), + Description: utils.Interface2String(mp["description"]), + } + } + } + return retVal +} diff --git a/platformapi/elmapi/product_test.go b/platformapi/elmapi/product_test.go new file mode 100644 index 00000000..77665690 --- /dev/null +++ b/platformapi/elmapi/product_test.go @@ -0,0 +1,89 @@ +package elmapi + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" +) + +func TestGetShopCategoriesWithChildren(t *testing.T) { + result, err := elmapi.GetShopCategoriesWithChildren(157451618) + if err != nil || len(result) == 0 { + t.Fatalf("GetShopCategoriesWithChildren failed with error:%v", err) + } + sugarLogger.Debug(result[0]) +} + +func TestGetCategoryWithChildren(t *testing.T) { + result, err := elmapi.GetCategoryWithChildren(538250690) + if err != nil || result == nil { + t.Fatalf("GetCategoryWithChildren failed with error:%v", err) + } + sugarLogger.Debug(result) +} + +func TestGetBackCategory(t *testing.T) { + result, err := elmapi.GetBackCategory(157451618) + if err != nil || len(result) == 0 { + t.Fatalf("GetBackCategory failed with error:%v", err) + } + sugarLogger.Debug(result[0]) +} + +func TestGetItemsByCategoryId(t *testing.T) { + result, err := elmapi.GetItemsByCategoryId(1240437151) + if err != nil { + t.Fatalf("GetItemsByCategoryId failed with error:%v", err) + } + sugarLogger.Debug(string(utils.MustMarshal(result[0]))) +} + +func TestGetItem(t *testing.T) { + result, err := elmapi.GetItem(684455990) + if err != nil { + t.Fatalf("GetItem failed with error:%v", err) + } + sugarLogger.Debug(string(utils.MustMarshal(result))) +} + +func TestBatchGetItems(t *testing.T) { + result, err := elmapi.BatchGetItems([]int64{684460503, 684455990}) + if err != nil && len(result) != 2 { + t.Fatalf("BatchGetItems failed with error:%v", err) + } + if utils.MustInterface2Int64(result[1]["id"]) != 684455990 { + t.Fatal("BatchGetItems get wrong data") + } +} + +func TestGetItemByShopIdAndExtendCode(t *testing.T) { + result, err := elmapi.GetItemByShopIdAndExtendCode(162936407, "920") + if err != nil && result["id"] != 816260193 { + t.Fatalf("GetItemByShopIdAndExtendCode failed with error:%v, result:%v", err, result) + } +} + +func TestGetShopSalesItems(t *testing.T) { + result, err := elmapi.GetShopSalesItems(157465459) + if err != nil && len(result) == 0 { + t.Fatalf("GetShopSalesItems failed with error:%v, result:%v", err, result) + } + sugarLogger.Debug(result) +} + +func TestQueryItemByPage(t *testing.T) { + limit := 20 + result, err := elmapi.QueryItemByPage(157465459, 0, limit) + if err != nil && len(result) != limit { + t.Fatalf("QueryItemByPage failed with error:%v, result:%v", err, result) + } + // sugarLogger.Debug(result) +} + +func TestGetImageUrl(t *testing.T) { + result, err := elmapi.GetImageUrl("6a6c9de7311caccfe8fb1c839ba7aa15jpeg") + if err != nil && result == "" { + t.Fatalf("GetImageUrl failed with error:%v, result:%v", err, result) + } + // sugarLogger.Debug(result) +} diff --git a/platformapi/elmapi/store.go b/platformapi/elmapi/store.go new file mode 100644 index 00000000..fbf6b2a7 --- /dev/null +++ b/platformapi/elmapi/store.go @@ -0,0 +1,114 @@ +package elmapi + +import ( + "git.rosy.net.cn/baseapi/utils" +) + +// 没有创建与删除门店的概念 +type StoreIdInfo struct { + Id int `json:"id"` + Name string `json:"name"` +} + +const ( + KeyProperties = "properties" + KeyShopID = "shopId" + KeyShopIDs = "shopIds" +) + +// 获取商户账号信息,即得到所有账号下的门店相关信息 +// https://open.shop.ele.me/openapi/apilist/eleme-user/eleme-user-getUser +func (a *API) GetUser() (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.user.getUser", nil) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 因GetUser得到的信息太杂,这个函数进一步给出账号与门店分开的信息 +func (a *API) GetAccAndStores() ([]*StoreIdInfo, []*StoreIdInfo, error) { + result, err := a.GetUser() + if err == nil { + result2 := result["authorizedShops"].([]interface{}) + accIds := make([]*StoreIdInfo, 0) + storeIds := make([]*StoreIdInfo, 0) + for _, v := range result2 { + mapData := v.(map[string]interface{}) + id := int(utils.MustInterface2Int64(mapData["id"])) + store := &StoreIdInfo{ + Id: id, + Name: utils.Interface2String(mapData["name"]), + } + if id >= 90000000 && id <= 99999999 { // 账号信息 + accIds = append(accIds, store) + } else { + storeIds = append(storeIds, store) + } + } + return accIds, storeIds, nil + } + return nil, nil, err +} + +// 查询店铺信息 +// https://open.shop.ele.me/openapi/apilist/eleme-shop/eleme-shop-getShop +func (a *API) GetShop(shopId int) (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.shop.getShop", utils.Params2Map(KeyShopID, shopId)) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 更新店铺基本信息 +// https://open.shop.ele.me/openapi/apilist/eleme-shop/eleme-shop-updateShop +func (a *API) UpdateShop(shopId int, shopProperties map[string]interface{}) (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.shop.updateShop", utils.MergeMaps(utils.Params2Map(KeyShopID, shopId), utils.Params2Map(KeyProperties, shopProperties))) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 批量获取店铺简要 +// https://open.shop.ele.me/openapi/apilist/eleme-shop/eleme-shop-mgetShopStatus +func (a *API) MgetShopStatus(shopIds []int) (map[string]interface{}, error) { + result, err := a.AccessAPI("eleme.shop.mgetShopStatus", utils.Params2Map(KeyShopIDs, shopIds)) + if err == nil { + return result.Result.(map[string]interface{}), nil + } + return nil, err +} + +// 设置送达时间 +// https://open.shop.ele.me/openapi/apilist/eleme-shop/eleme-shop-setDeliveryTime +func (a *API) SetDeliveryTime(shopId, deliveryBasicMins, deliveryAdjustMins int) error { + _, err := a.AccessAPI("eleme.shop.setDeliveryTime", map[string]interface{}{ + KeyShopID: shopId, + "deliveryBasicMins": deliveryBasicMins, + "deliveryAdjustMins": deliveryAdjustMins, + }) + return err +} + +// 设置是否支持在线退单 +// https://open.shop.ele.me/openapi/apilist/eleme-shop/eleme-shop-setOnlineRefund +func (a *API) SetOnlineRefund(shopId int, enabled bool) error { + _, err := a.AccessAPI("eleme.shop.setOnlineRefund", map[string]interface{}{ + KeyShopID: shopId, + "enable": enabled, + }) + return err +} + +// 设置是否支持预定单及预定天数 +// https://open.shop.ele.me/openapi/apilist/eleme-shop/eleme-shop-setBookingStatus +func (a *API) SetBookingStatus(shopId int, enabled bool, maxBookingDays int) error { + _, err := a.AccessAPI("eleme.shop.setBookingStatus", map[string]interface{}{ + KeyShopID: shopId, + "enable": enabled, + "maxBookingDays": maxBookingDays, + }) + return err +} diff --git a/platformapi/elmapi/store_test.go b/platformapi/elmapi/store_test.go new file mode 100644 index 00000000..ed1ce56e --- /dev/null +++ b/platformapi/elmapi/store_test.go @@ -0,0 +1,29 @@ +package elmapi + +import ( + "testing" +) + +func TestGetUser(t *testing.T) { + result, err := elmapi.GetUser() + if err != nil { + t.Fatalf("GetUser failed with error:%v", err) + } + sugarLogger.Debug(result) +} + +func TestGetAccAndStores(t *testing.T) { + accs, stores, err := elmapi.GetAccAndStores() + if err != nil || len(stores) == 0 || len(accs) == 0 { + t.Fatalf("GetAccAndStores failed with error:%v", err) + } + sugarLogger.Debug(stores[0]) +} + +func TestGetShop(t *testing.T) { + result, err := elmapi.GetShop(157451618) + if err != nil { + t.Fatalf("GetShop failed with error:%v", err) + } + sugarLogger.Debug(result) +} diff --git a/platformapi/jdapi/product.go b/platformapi/jdapi/product.go index 75243766..00f7f8a1 100644 --- a/platformapi/jdapi/product.go +++ b/platformapi/jdapi/product.go @@ -50,7 +50,7 @@ const ( ) type SkuIDPair struct { - SkuId int `json:"skuId"` + SkuId int64 `json:"skuId"` OutSkuId string `json:"outSkuId"` } @@ -114,7 +114,7 @@ func (a *API) QueryPageBrandInfo(pageNo, pageSize, brandId int, brandName string // 获取京东到家类目信息接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=d287d326124d42c090cff03c16385706 -func (a *API) QueryChildCategoriesForOP(pid int) (catList []map[string]interface{}, err error) { +func (a *API) QueryChildCategoriesForOP(pid int64) (catList []map[string]interface{}, err error) { result, err := a.AccessAPINoPage("api/queryChildCategoriesForOP", utils.Params2Map("fields", []string{ "ID", "PID", @@ -131,7 +131,7 @@ func (a *API) QueryChildCategoriesForOP(pid int) (catList []map[string]interface // 新增商家店内分类信息接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=de26f24a62aa47a49e5ab7579d638cb3 -func (a *API) AddShopCategory(pid int, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) { +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, @@ -163,7 +163,7 @@ func (a *API) QueryCategoriesByOrgCode() (catList []map[string]interface{}, err // 修改商家店内分类信息接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=1de278c670b64da492f676ab78d62f73 -func (a *API) UpdateShopCategory(id int, shopCategoryName string) error { +func (a *API) UpdateShopCategory(id int64, shopCategoryName string) error { params := map[string]interface{}{ KeyID: id, KeyShopCategoryName: shopCategoryName, @@ -174,7 +174,7 @@ func (a *API) UpdateShopCategory(id int, shopCategoryName string) error { // 修改商家店内分类顺序接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=2a8267602e814be9828f0c7ce307b872 -func (a *API) ChangeShopCategoryOrder(pid int, childIds []int) error { +func (a *API) ChangeShopCategoryOrder(pid int64, childIds []int) error { params := map[string]interface{}{ KeyPID: pid, KeyChildIds: childIds, @@ -185,14 +185,14 @@ func (a *API) ChangeShopCategoryOrder(pid int, childIds []int) error { // 删除商家店内分类接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=c17b96e9fe254b2a8574f6d1bc0c1667 -func (a *API) DelShopCategory(id int) error { +func (a *API) DelShopCategory(id int64) error { _, err := a.AccessAPINoPage("pms/delShopCategory", utils.Params2Map(KeyID, id), nil, nil, nil) return err } // 新增商品信息接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=dfe6a5ca73fa421da1c9f969b848113e -func (a *API) AddSku(outSkuId string, cagtegoryId int, shopCategories []int, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) { +func (a *API) AddSku(outSkuId string, cagtegoryId int64, shopCategories []int, 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, @@ -266,7 +266,7 @@ func (a *API) QuerySkuInfos(skuName string, skuId, pageNo, pageSize int, isFilte // 查询商品图片处理结果接口 // https://opendj.jd.com/staticnew/widgets/resources.html?groupid=180&apiid=17506653e03542f9a49023711780c30d -func (a *API) QueryListBySkuIds(skuIds []int, addParams map[string]interface{}) (retVal []map[string]interface{}, err error) { +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 diff --git a/utils/typeconv.go b/utils/typeconv.go index 6ff16a30..4989d80f 100644 --- a/utils/typeconv.go +++ b/utils/typeconv.go @@ -240,3 +240,13 @@ func Map2URLValues(mapData map[string]interface{}) (retVal url.Values) { } return retVal } + +func MapKV2List(mapData map[string]interface{}) []map[string]interface{} { + retVal := make([]map[string]interface{}, len(mapData)) + index := 0 + for _, v := range mapData { + retVal[index] = v.(map[string]interface{}) + index++ + } + return retVal +}