- 清理三个平台的门店商品批处理操作,部分失败返回失败条目

This commit is contained in:
gazebo
2019-07-21 16:08:37 +08:00
parent 0298f7de71
commit 414c359200
12 changed files with 597 additions and 179 deletions

View File

@@ -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)
}

View File

@@ -33,8 +33,9 @@ const (
)
const (
resultKeyData = "data"
resultKeyMsg = "success_msg"
resultKeyData = "data"
resultKeyMsg = "msg"
resultKeySuccessMsg = "success_msg"
)
const (
GeneralMaxLimit = 200 // 大多数的API的批处理最大条数

View File

@@ -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,

View File

@@ -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))
}