diff --git a/platformapi/ebaiapi/activity.go b/platformapi/ebaiapi/activity.go index 48da4a79..b039d473 100644 --- a/platformapi/ebaiapi/activity.go +++ b/platformapi/ebaiapi/activity.go @@ -1,7 +1,6 @@ package ebaiapi import ( - "fmt" "strings" "git.rosy.net.cn/baseapi/utils" @@ -11,15 +10,16 @@ const ( ActivityTypeDirectDown = 2 // 商品直降 ActivityTypeFullDiscount = 8 // 品类满减 - ActivityPFBaidu = 1 - ActivityPFELM = 2 - ActivityPFAll = 4 + ActivityPFBaidu = 1 // 星选 + ActivityPFELM = 2 // 饿了么 + ActivityPFAll = 4 // 星选&饿了么 - ActivityConflictShare = 0 - ActivityConfilictExclude = 1 + ActivityConflictShare = 0 // 与全店满减等其他活动同享 + ActivityConfilictExclude = 1 // 与全店满减等其他活动互斥 - ActivityShowStatusEnabled = 2 - ActivityShowStatusDisabled = 4 + // 下面两个是做什么用的? + // ActivityShowStatusEnabled = 2 + // ActivityShowStatusDisabled = 4 ) type ActivityRule struct { @@ -45,40 +45,50 @@ type ActivityInfo struct { PromotionSkuDesc string `json:"promotion_sku_desc,omitempty"` // 店铺页活动商品的分类名称,不超过8个字。 Rule []*ActivityRule `json:"rule,omitempty"` - BaiduShopID int64 `json:"baiduShopID,omitempty"` - ShowStatus int `json:"showStatus,omitempty"` + BaiduShopID int64 `json:"baidu_shop_id,omitempty"` // 这个用于查询时返回值,设置时这里设置的值会被忽略 + // ShowStatus int `json:"showStatus,omitempty"` } -type ActivitySkuInfo struct { +type ActivitySkuInfo4Add struct { SkuID string `json:"sku_id"` Stock int `json:"stock"` - PromotionPrice float32 `json:"special_price"` // 直降用,复用 - StoreUserLimit int `json:"store_user_limit"` // 直降用 + StoreUserLimit int `json:"store_user_limit"` + SpecialPrice int64 `json:"special_price"` } -type ActivitySkuInfoEx struct { - ActivitySkuInfo - BaiduShopID int64 `json:"baidu_shop_id"` - UpcName string `json:"upc_name"` - OriginalPrice float32 `json:"original_price"` +type ActivitySkuInfo4List struct { + BaiduShopID int64 `json:"baidu_shop_id"` + SkuID string `json:"sku_id"` + UpcName string `json:"upc_name"` + Stock int `json:"stock"` + + PromotionPrice float32 `json:"promotion_price"` // 商品活动价,单位元,品类满减活动不返回活动价。 + OriginalPrice float32 `json:"original_price"` // 添加商品时商品原价,单位元。 } type ActivitySkuInfo4Update struct { - ActivitySkuInfo - BaiduShopID int64 `json:"baidu_shop_id"` - ShopID string `json:"shop_id"` - CustomSkuID string `json:"custom_sku_id"` + BaiduShopID int64 `json:"baidu_shop_id,omitempty"` + ShopID string `json:"shop_id,omitempty"` + SkuID string `json:"sku_id,omitempty"` + CustomSkuID string `json:"custom_sku_id,omitempty"` + Stock int `json:"stock,omitempty"` + + StoreUserLimit int `json:"store_user_limit,omitempty"` + SpecialPrice int64 `json:"special_price,omitempty"` } type ActivitySkuListInfo struct { - ActivityID int64 `json:"activity_id"` - ActivityType int `json:"activity_type"` - ActivityName string `json:"activity_name"` - SkuList []*ActivitySkuInfoEx `json:"sku_list"` + ActivityID int64 `json:"activity_id"` + ActivityType int `json:"activity_type"` + ActivityName string `json:"activity_name"` + SkuList []*ActivitySkuInfo4List `json:"sku_list"` } +// 创建商品营销活动 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_create func (a *API) ActivityCreate(shopID string, baiduShopID, supplierID int64, activity *ActivityInfo) (activityID int64, err error) { + activity.BaiduShopID = 0 params := utils.Struct2FlatMap(activity) result, err := a.AccessAPI("activity.create", utils.MergeMaps(params, a.genShopIDParams(shopID, baiduShopID, supplierID))) if err == nil { @@ -87,7 +97,10 @@ func (a *API) ActivityCreate(shopID string, baiduShopID, supplierID int64, activ return 0, err } +// 更新活动信息 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_update func (a *API) ActivityUpdate(activityID int64, shopID string, baiduShopID, supplierID int64, activity *ActivityInfo) (newActivityID int64, err error) { + activity.BaiduShopID = 0 params := utils.Struct2FlatMap(activity) params[KeyActivityID] = activityID result, err := a.AccessAPI("activity.update", utils.MergeMaps(params, a.genShopIDParams(shopID, baiduShopID, supplierID))) @@ -97,6 +110,8 @@ func (a *API) ActivityUpdate(activityID int64, shopID string, baiduShopID, suppl return 0, err } +// 下线商品营销活动 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_disable func (a *API) ActivityDisable(activityID int64, shopID string, baiduShopID, supplierID int64) (err error) { params := a.genShopIDParams(shopID, baiduShopID, supplierID) params[KeyActivityID] = activityID @@ -104,6 +119,8 @@ func (a *API) ActivityDisable(activityID int64, shopID string, baiduShopID, supp return err } +// 查看活动信息 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_get func (a *API) ActivityGet(activityID int64, shopID string, baiduShopID, supplierID int64) (activityInfo *ActivityInfo, err error) { params := a.genShopIDParams(shopID, baiduShopID, supplierID) params[KeyActivityID] = activityID @@ -115,7 +132,9 @@ func (a *API) ActivityGet(activityID int64, shopID string, baiduShopID, supplier return activityInfo, err } -func (a *API) ActivitySkuAddBatch(activityID int64, shopID string, baiduShopID int64, activityType int, skuList []*ActivitySkuInfo, isSkuIDCustom bool) (successIDs []string, err error) { +// 批量添加活动商品 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_sku_add_batch +func (a *API) ActivitySkuAddBatch(activityID int64, shopID string, baiduShopID int64, activityType int, skuList []*ActivitySkuInfo4Add, isSkuIDCustom bool) (successIDs []string, err error) { params := a.genShopIDParams(shopID, baiduShopID, 0) params[KeyActivityID] = activityID skusKey := "activity_skus" @@ -130,7 +149,7 @@ func (a *API) ActivitySkuAddBatch(activityID int64, shopID string, baiduShopID i return nil, err } -func skuList2Str(activityType int, skuList []*ActivitySkuInfo, isSkuIDCustom bool) string { +func skuList2Str(activityType int, skuList []*ActivitySkuInfo4Add, isSkuIDCustom bool) string { skuList2 := []string{} for _, v := range skuList { strList := []string{ @@ -138,14 +157,18 @@ func skuList2Str(activityType int, skuList []*ActivitySkuInfo, isSkuIDCustom boo utils.Int2Str(v.Stock), } if activityType == ActivityTypeDirectDown { - strList = append(strList, fmt.Sprintf("%.2f", v.PromotionPrice)) - strList = append(strList, utils.Int2Str(v.StoreUserLimit)) + strList = append(strList, utils.Int64ToStr(v.SpecialPrice)) + if v.StoreUserLimit > 0 { + strList = append(strList, utils.Int2Str(v.StoreUserLimit)) + } } skuList2 = append(skuList2, strings.Join(strList, ":")) } return strings.Join(skuList2, ";") } +// 批量删除活动商品 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_sku_delete_batch func (a *API) ActivitySkuDeleteBatch(activityID int64, shopID string, baiduShopID int64, skuIDs []string, isSkuIDCustom bool) (successIDs []string, err error) { params := a.genShopIDParams(shopID, baiduShopID, 0) params[KeyActivityID] = activityID @@ -161,6 +184,8 @@ func (a *API) ActivitySkuDeleteBatch(activityID int64, shopID string, baiduShopI return nil, err } +// 批量添加活动商品 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_sku_add_batch func (a *API) ActivitySkuList(activityID int64, shopID string, baiduShopID, supplierID int64, skuIDs []string, isSkuIDCustom bool) (activityInfo *ActivitySkuListInfo, err error) { params := a.genShopIDParams(shopID, baiduShopID, supplierID) params[KeyActivityID] = activityID @@ -179,35 +204,17 @@ func (a *API) ActivitySkuList(activityID int64, shopID string, baiduShopID, supp params["page"] = page result, err = a.AccessAPI("activity.sku.list", params) if err == nil { - // tmpActivityInfo := &ActivitySkuListInfo{} - // if err = utils.Map2StructByJson(result.Data, tmpActivityInfo, true); err != nil { - // return nil, err - // } - // if activityInfo == nil { - // activityInfo = tmpActivityInfo - // } else { - // activityInfo.SkuList = append(activityInfo.SkuList, tmpActivityInfo.SkuList...) - // } resultMap := result.Data.(map[string]interface{}) if activityInfo == nil { - activityInfo = &ActivitySkuListInfo{ - ActivityID: activityID, - ActivityType: int(utils.Str2Int64(utils.Interface2String(resultMap["activity_type"]))), - ActivityName: utils.Interface2String(resultMap["activity_name"]), + if err = utils.Map2StructByJson(resultMap, &activityInfo, true); err != nil { + return nil, err } - } - for _, v := range resultMap["sku_list"].([]interface{}) { - skuMap := v.(map[string]interface{}) - activityInfo.SkuList = append(activityInfo.SkuList, &ActivitySkuInfoEx{ - ActivitySkuInfo: ActivitySkuInfo{ - SkuID: utils.Interface2String(skuMap["sku_id"]), - Stock: int(utils.Str2Int64(utils.Interface2String(skuMap["stock"]))), - PromotionPrice: float32(utils.Interface2Float64WithDefault(skuMap["promotion_price"], 0)), - }, - BaiduShopID: utils.Str2Int64(utils.Interface2String(skuMap["baidu_shop_id"])), - OriginalPrice: float32(utils.Interface2Float64WithDefault(skuMap["original_price"], 0)), - UpcName: utils.Interface2String(skuMap["upc_name"]), - }) + } else { + var skuList []*ActivitySkuInfo4List + if err = utils.Map2StructByJson(resultMap["sku_list"], &skuList, true); err != nil { + return nil, err + } + activityInfo.SkuList = append(activityInfo.SkuList, skuList...) } if len(activityInfo.SkuList) >= int(utils.MustInterface2Int64(resultMap["total"])) { break @@ -220,6 +227,8 @@ func (a *API) ActivitySkuList(activityID int64, shopID string, baiduShopID, supp return activityInfo, err } +// 批量更新活动商品 +// https://open-be.ele.me/dev/api/doc/v3/#api-Marketing-activity_sku_update_batch func (a *API) ActivitySkuUpdateBatch(activityID int64, actSkuInfoList []*ActivitySkuInfo4Update) (faildInfoList []string, err error) { result, err := a.AccessAPI("activity.sku.update.batch", map[string]interface{}{ KeyActivityID: activityID, diff --git a/platformapi/ebaiapi/activity_test.go b/platformapi/ebaiapi/activity_test.go index 122043b5..e5274a90 100644 --- a/platformapi/ebaiapi/activity_test.go +++ b/platformapi/ebaiapi/activity_test.go @@ -7,8 +7,10 @@ import ( "git.rosy.net.cn/baseapi/utils" ) +const testActivityID = 3000000000517188 + func TestActivityCreate(t *testing.T) { - activityInfo, err := api.ActivityCreate("", 2235877569, 0, &ActivityInfo{ + activityInfo, err := api.ActivityCreate("", testShopBaiduID, 0, &ActivityInfo{ ActivityName: "测试活动0403", StartTime: time.Now().Unix(), EndTime: time.Now().Add(24 * time.Hour).Unix(), @@ -29,8 +31,24 @@ func TestActivityCreate(t *testing.T) { } } +func TestActivitySkuAddBatch(t *testing.T) { + result, err := api.ActivitySkuAddBatch(testActivityID, "", testShopBaiduID, ActivityTypeDirectDown, []*ActivitySkuInfo4Add{ + &ActivitySkuInfo4Add{ + SkuID: "3594", + Stock: 9, + SpecialPrice: 100, + StoreUserLimit: 9, + }, + }, true) + if err != nil { + t.Fatal(err) + } else { + t.Log(utils.Format4Output(result, false)) + } +} + func TestActivityUpdate(t *testing.T) { - activityInfo, err := api.ActivityUpdate(6000268610, "", 2235877569, 0, &ActivityInfo{ + activityInfo, err := api.ActivityUpdate(6000268610, "", testShopBaiduID, 0, &ActivityInfo{ ActivityName: "测试活动0403", StartTime: time.Now().Unix(), EndTime: time.Now().Add(24 * time.Hour).Unix(), @@ -52,7 +70,7 @@ func TestActivityUpdate(t *testing.T) { } func TestActivityGet(t *testing.T) { - activityInfo, err := api.ActivityGet(6000268610, "", 2235877569, 0) + activityInfo, err := api.ActivityGet(3000000000517188, "", testShopBaiduID, 0) if err != nil { t.Fatal(err) } else { @@ -61,14 +79,14 @@ func TestActivityGet(t *testing.T) { } func TestActivityDisable(t *testing.T) { - err := api.ActivityDisable(6000268604, "", 2235877569, 0) + err := api.ActivityDisable(6000268604, "", testShopBaiduID, 0) if err != nil { t.Fatal(err) } } func TestActivitySkuList(t *testing.T) { - activityInfo, err := api.ActivitySkuList(6000058442, "", 0, 2233065879, nil, false) + activityInfo, err := api.ActivitySkuList(3000000000517188, "", testShopBaiduID, 0, nil, false) if err != nil { t.Fatal(err) } else { diff --git a/platformapi/ebaiapi/ebaiapi_test.go b/platformapi/ebaiapi/ebaiapi_test.go index 7d450238..5a30496e 100644 --- a/platformapi/ebaiapi/ebaiapi_test.go +++ b/platformapi/ebaiapi/ebaiapi_test.go @@ -12,8 +12,8 @@ import ( ) const ( - testShopBaiduID = 2233976901 - testShopID = "100077" + testShopBaiduID = 2267254343 + testShopID = "2" ) var ( @@ -25,9 +25,8 @@ func init() { logger, _ := zap.NewDevelopment() sugarLogger = logger.Sugar() baseapi.Init(sugarLogger) - - // sandbox - api = New("62923", "aa4cdc6c1108486b") + // sandbox,果园测试门店 + api = New("62289", "d3ec2358d6a819ea") // prod // api = New("34665", "c3db75b754ea2d89") diff --git a/platformapi/jdapi/promotion_order_test.go b/platformapi/jdapi/promotion_order_test.go index 56a1f3bd..079bf751 100644 --- a/platformapi/jdapi/promotion_order_test.go +++ b/platformapi/jdapi/promotion_order_test.go @@ -14,7 +14,7 @@ func TestOrderDiscountSubmitActivity(t *testing.T) { PromType: OrderDiscountActivityTypeManJian, BeginTime: utils.Time2Str(time.Now().Add(1 * time.Hour)), EndTime: utils.Time2Str(time.Now().Add(48 * time.Hour)), - ParticipationMode: ParticipationModeAllSku, + ParticipationMode: ParticipationModePartSku, Display: "hello", OutStationNos: []string{"2"}, // OutSkuIDs: []string{"5199"}, @@ -36,7 +36,7 @@ func TestOrderDiscountSubmitActivity(t *testing.T) { } func TestOrderDiscountQuerySubmitActivityResult(t *testing.T) { - result, err := api.OrderDiscountQuerySubmitActivityResult(10000048) + result, err := api.OrderDiscountQuerySubmitActivityResult(10000051) if err != nil { t.Fatal(err) } @@ -44,7 +44,7 @@ func TestOrderDiscountQuerySubmitActivityResult(t *testing.T) { } func TestOrderDiscountQueryActivityInfo(t *testing.T) { - result, err := api.OrderDiscountQueryActivityInfo(10000046) + result, err := api.OrderDiscountQueryActivityInfo(10000051) if err != nil { t.Fatal(err) } @@ -52,7 +52,7 @@ func TestOrderDiscountQueryActivityInfo(t *testing.T) { } func TestOrderDiscountCancelActivity(t *testing.T) { - err := api.OrderDiscountCancelActivity(10000046, "test", "") + err := api.OrderDiscountCancelActivity(10000049, "test", "") if err != nil { t.Fatal(err) }