- 清理三个平台的门店商品批处理操作,部分失败返回失败条目
This commit is contained in:
@@ -186,7 +186,7 @@ func (a *API) FullDiscountBatchSave(poiCode string, actInfo *FullDiscountActInfo
|
||||
if actInfo.ActType == ActTypeSkuFullDiscount {
|
||||
params["app_foods"] = string(utils.MustMarshal(actSkuList))
|
||||
}
|
||||
result, err := a.AccessAPI2("act/full/discount/batchsave", false, params, resultKeyMsg)
|
||||
result, err := a.AccessAPI2("act/full/discount/batchsave", false, params, resultKeySuccessMsg)
|
||||
if err == nil {
|
||||
err = utils.UnmarshalUseNumber([]byte(result.(string)), &actIDList)
|
||||
}
|
||||
@@ -322,7 +322,7 @@ func (a *API) RetailDiscountBatchSave(poiCode string, actData []*RetailDiscountA
|
||||
result, err := a.AccessAPI2("act/retail/discount/batchsave", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"act_data": string(utils.MustMarshal(actData)),
|
||||
}, resultKeyMsg)
|
||||
}, resultKeySuccessMsg)
|
||||
if err == nil {
|
||||
err = utils.UnmarshalUseNumber([]byte(result.(string)), &actResult)
|
||||
}
|
||||
@@ -394,7 +394,7 @@ func (a *API) InStoreCouponBatchSave(poiCode string, limitTime *LimitTime, coupo
|
||||
KeyAppPoiCode: poiCode,
|
||||
"limit_time": string(utils.MustMarshal(limitTime)),
|
||||
"act_data": string(utils.MustMarshal(couponInfoList)),
|
||||
}, resultKeyMsg)
|
||||
}, resultKeySuccessMsg)
|
||||
if err == nil {
|
||||
err = utils.UnmarshalUseNumber([]byte(result.(string)), &couponResultList)
|
||||
}
|
||||
|
||||
@@ -33,8 +33,9 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
resultKeyData = "data"
|
||||
resultKeyMsg = "success_msg"
|
||||
resultKeyData = "data"
|
||||
resultKeyMsg = "msg"
|
||||
resultKeySuccessMsg = "success_msg"
|
||||
)
|
||||
const (
|
||||
GeneralMaxLimit = 200 // 大多数的API的批处理最大条数
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package mtwmapi
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
@@ -14,6 +15,15 @@ const (
|
||||
MaxBatchDeleteSize = 100 // retailCat/batchdelete/catandretail这个接口的批量最大值
|
||||
)
|
||||
|
||||
const (
|
||||
SellStatusOnline = 0 // 上架
|
||||
SellStatusOffline = 1 // 下架
|
||||
)
|
||||
|
||||
var (
|
||||
retailBatchFailedSkuReg = regexp.MustCompile(`((?:\d+;)+)`)
|
||||
)
|
||||
|
||||
type RetailCategoryInfo struct {
|
||||
Name string `json:"name"`
|
||||
Sequence int `json:"sequence"`
|
||||
@@ -91,6 +101,11 @@ type AppFood struct {
|
||||
ZhName string `json:"zh_name"`
|
||||
}
|
||||
|
||||
type AppFoodResult struct {
|
||||
AppFoodCode string `json:"app_food_code"`
|
||||
ErrorMsg string `json:"error_msg"`
|
||||
}
|
||||
|
||||
// 美团分类没有ID,就以名字为唯一标识,不论级别都必须不能重名
|
||||
// name(和originName)的长度不能超过10个字符(字符,不是字节)
|
||||
// 创建一级分类,originName为空,name为新分类名,secondaryName为空
|
||||
@@ -168,28 +183,78 @@ func (a *API) RetailList(poiCode string, offset, limit int) (foodList []*AppFood
|
||||
return foodList, err
|
||||
}
|
||||
|
||||
func (a *API) RetailBatchInitData(poiCode string, foodDataList []map[string]interface{}) (err error) {
|
||||
_, err = a.AccessAPI("retail/batchinitdata", false, map[string]interface{}{
|
||||
func handleRetailBatchResult(result interface{}) (failedFoodList []*AppFoodResult, err error) {
|
||||
if msg, ok := result.(string); ok && msg != "" {
|
||||
err = utils.UnmarshalUseNumber([]byte(msg), &failedFoodList)
|
||||
}
|
||||
return failedFoodList, err
|
||||
}
|
||||
|
||||
func handleRetailBatchResultByRegexp(result interface{}) (failedFoodList []*AppFoodResult, err error) {
|
||||
if msg, ok := result.(string); ok && msg != "" {
|
||||
findList := retailBatchFailedSkuReg.FindStringSubmatch(msg)
|
||||
if len(findList) == 2 {
|
||||
ids := strings.Split(strings.Trim(findList[1], ";"), ";")
|
||||
if len(ids) > 0 {
|
||||
failedFoodList = make([]*AppFoodResult, len(ids))
|
||||
for k, v := range ids {
|
||||
failedFoodList[k] = &AppFoodResult{
|
||||
AppFoodCode: v,
|
||||
ErrorMsg: "",
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return failedFoodList, err
|
||||
}
|
||||
|
||||
func (a *API) RetailBatchInitData(poiCode string, foodDataList []map[string]interface{}) (failedFoodList []*AppFoodResult, err error) {
|
||||
result, err := a.AccessAPI2("retail/batchinitdata", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"food_data": string(utils.MustMarshal(foodDataList)),
|
||||
})
|
||||
return err
|
||||
}, resultKeyMsg)
|
||||
if err == nil {
|
||||
failedFoodList, err = handleRetailBatchResult(result)
|
||||
}
|
||||
return failedFoodList, err
|
||||
}
|
||||
|
||||
func (a *API) RetailSkuPrice(poiCode string, foodData []*BareStoreFoodInfo) (err error) {
|
||||
_, err = a.AccessAPI("retail/sku/price", false, map[string]interface{}{
|
||||
func (a *API) RetailSkuPrice(poiCode string, foodData []*BareStoreFoodInfo) (failedFoodList []*AppFoodResult, err error) {
|
||||
result, err := a.AccessAPI2("retail/sku/price", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"food_data": string(utils.MustMarshal(foodData)),
|
||||
})
|
||||
return err
|
||||
}, resultKeyMsg)
|
||||
if err == nil {
|
||||
failedFoodList, err = handleRetailBatchResult(result)
|
||||
}
|
||||
return failedFoodList, err
|
||||
}
|
||||
|
||||
func (a *API) RetailSkuStock(poiCode string, foodData []*BareStoreFoodInfo) (err error) {
|
||||
_, err = a.AccessAPI("retail/sku/stock", false, map[string]interface{}{
|
||||
func (a *API) RetailSkuStock(poiCode string, foodData []*BareStoreFoodInfo) (failedFoodList []*AppFoodResult, err error) {
|
||||
result, err := a.AccessAPI2("retail/sku/stock", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"food_data": string(utils.MustMarshal(foodData)),
|
||||
})
|
||||
return err
|
||||
}, resultKeyMsg)
|
||||
if err == nil {
|
||||
failedFoodList, err = handleRetailBatchResult(result)
|
||||
}
|
||||
return failedFoodList, err
|
||||
}
|
||||
|
||||
// retail/sku/sellStatus在部分失败时会返回错误,其它相应的批处理函数则会返回成功
|
||||
func (a *API) RetailSkuSellStatus(poiCode string, foodData []*BareStoreFoodInfo, sellStatus int) (failedFoodList []*AppFoodResult, err error) {
|
||||
_, err = a.AccessAPI2("retail/sku/sellStatus", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"food_data": string(utils.MustMarshal(foodData)),
|
||||
"sell_status": sellStatus,
|
||||
}, resultKeyMsg)
|
||||
if err != nil {
|
||||
if errExt, ok := err.(*utils.ErrorWithCode); ok {
|
||||
failedFoodList, _ = handleRetailBatchResultByRegexp(errExt.ErrMsg())
|
||||
}
|
||||
}
|
||||
return failedFoodList, err
|
||||
}
|
||||
|
||||
func (a *API) RetailGet(poiCode, foodCode string) (food *AppFood, err error) {
|
||||
@@ -216,24 +281,6 @@ func (a *API) RetailSkuSave(poiCode, foodCode string, standardSkus, unstandardSk
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *API) RetailSkuSellStatus(poiCode string, foodData []map[string]interface{}, sellStatus int) (err error) {
|
||||
_, err = a.AccessAPI("retail/sku/sellStatus", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"food_data": string(utils.MustMarshal(foodData)),
|
||||
"sell_status": sellStatus,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *API) RetailSkuSellStatus2(poiCode string, foodData []*BareStoreFoodInfo, sellStatus int) (err error) {
|
||||
_, err = a.AccessAPI("retail/sku/sellStatus", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"food_data": string(utils.MustMarshal(foodData)),
|
||||
"sell_status": sellStatus,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *API) RetailDelete(poiCode, foodCode string) (err error) {
|
||||
_, err = a.AccessAPI("retail/delete", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
|
||||
@@ -82,13 +82,14 @@ func TestRetailDelete(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetailBatchInitData(t *testing.T) {
|
||||
err := api.RetailBatchInitData("2464052", []map[string]interface{}{
|
||||
failedFoods, err := api.RetailBatchInitData(testPoiCode, []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"app_food_code": "23841",
|
||||
"box_num": 0,
|
||||
"box_price": 0,
|
||||
"category_name": "豆制良品🌾🌾",
|
||||
"category_name": "南北干货",
|
||||
"description": "",
|
||||
"is_sold_out": 0,
|
||||
"min_order_count": 1,
|
||||
@@ -104,6 +105,29 @@ func TestRetailBatchInitData(t *testing.T) {
|
||||
"upc": "",
|
||||
},
|
||||
},
|
||||
// "tag_id": "200000380",
|
||||
"unit": "份",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"app_food_code": "23840",
|
||||
"box_num": 0,
|
||||
"box_price": 0,
|
||||
"category_name": "南北干货",
|
||||
"description": "",
|
||||
"is_sold_out": 0,
|
||||
"min_order_count": 1,
|
||||
"name": "干腐竹约150g/份",
|
||||
"picture": "http://image.jxc4.com/5f7fba025fc9348796039423c48ac3f5.jpg",
|
||||
"price": 1000,
|
||||
"skus": []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"price": 1000,
|
||||
"sku_id": "23840",
|
||||
"spec": "150g",
|
||||
"stock": "*",
|
||||
"upc": "",
|
||||
},
|
||||
},
|
||||
"tag_id": "200000380",
|
||||
"unit": "份",
|
||||
},
|
||||
@@ -111,4 +135,97 @@ func TestRetailBatchInitData(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(failedFoods, false))
|
||||
}
|
||||
|
||||
func TestRetailSkuPrice(t *testing.T) {
|
||||
result, err := api.RetailSkuPrice(testPoiCode, []*BareStoreFoodInfo{
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "23841",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "23841",
|
||||
Price: "1.2",
|
||||
},
|
||||
},
|
||||
},
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "23840",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "23840",
|
||||
Price: "1.1",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
func TestRetailSkuStock(t *testing.T) {
|
||||
result, err := api.RetailSkuStock(testPoiCode, []*BareStoreFoodInfo{
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "23841",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "23841",
|
||||
Price: "1.2",
|
||||
Stock: "123",
|
||||
},
|
||||
},
|
||||
},
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "23840",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "23840",
|
||||
Stock: "123",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
func TestRetailSkuSellStatus(t *testing.T) {
|
||||
result, err := api.RetailSkuSellStatus(testPoiCode, []*BareStoreFoodInfo{
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "23841",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "23841",
|
||||
Price: "1.2",
|
||||
Stock: "123",
|
||||
},
|
||||
},
|
||||
},
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "23840",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "23840",
|
||||
Stock: "123",
|
||||
},
|
||||
},
|
||||
},
|
||||
&BareStoreFoodInfo{
|
||||
AppFoodCode: "2384999",
|
||||
Skus: []*BareStoreSkuInfo{
|
||||
&BareStoreSkuInfo{
|
||||
SkuID: "2384999",
|
||||
Stock: "123",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, SellStatusOffline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user