diff --git a/platformapi/jdshopapi/jxshopapi_test.go b/platformapi/jdshopapi/jxshopapi_test.go index 281f9fc8..69287e65 100644 --- a/platformapi/jdshopapi/jxshopapi_test.go +++ b/platformapi/jdshopapi/jxshopapi_test.go @@ -19,7 +19,5 @@ func init() { // api.SetCookieWithStr(` // thor=5E1D1AE7BBC42FACA3496D9C54AF9F879CF4836860E75FF70BFCDEAC5A75C1C53633AB511CD9AA7FDDF502F48AE9683E660B3FCBF8EDC500734ADE8D7CE4BAB4B2947AD7610768EA07E5A6D3B88CDA3EBB7D998FEBA0B113F040A36B044CC4B9310C7953F2DDC2DE15C56C8839EFE493FE4CD8F9CECED7EE4097AE7F83EE6D447050842AB44A715BAB2666C6BE3AB085; // `) - api.SetCookieWithStr(` - shshshfpa=13b38d4a-8ba0-df12-0012-82d9a37fb835-1573795914; shshshfpb=abYp8Dq5JobRtp2pkZa7MbA%3D%3D; cart_uuid=1bd562b37ef02371; 3AB9D23F7A4B3C9B=AK36FFYF5J6WMPRH7YTXMEX4CATHR6NAA3IQEESU2I33FEJRQ3DRLU4SZJYD2XGFLCFW43DHYP5HQKOMR4EFQSLKLA; user-key=b84736c7-ce29-44e0-a5dc-4cc6b5e911b3; cn=3; unpl=V2_ZzNtbUMEExdyXRIDexEIV2ILRw9KB0ccfAoTBilKWlJiVxNUclRCFnQURlRnGF8UZwQZX0JcQRBFCEdkeB5fA2AFEFlBZxBFLV0CFi9JH1c%2bbRJUQ1JKHXwPRlF8EGw1ZAMiXUNnQxF9CERXfRhdBWcGEllBX0AWdwhCVUspWzVXMxZbQF5DE0UJdlVLWwhZYQoRXkpWDhVxAEZWeB9dBGcDF11GVEsWdgpGUHopXTVk; language=zh_CN; __jdv=89149253|direct|-|none|-|1605602605135; track=46099cdb-39fb-abe6-579e-ea9536a8cf9c; pinId=WMIzMhF5BfI9awOQjAcbdQ; pin=shop_jxcs2020; unick=shop_jxcs2020; _tp=VqmxIvk3BVEJnO6UciQrRA%3D%3D; _pst=shop_jxcs2020; TrackID=1H77OBLbyGWeEsySRRboJvFjSeNZ5OFrPG-lfM2Br17rxVaH2XR5YGDIPlQMDSI4RN0pz61IcyAGth7c78hH1UU_gWWlA9MM0Y3f3Q_m_Ngc; thor=5E1D1AE7BBC42FACA3496D9C54AF9F879CF4836860E75FF70BFCDEAC5A75C1C58363A31D3BA94C555E4594159384163B0ACA28C3850A6FF8EB0F90614C4D03DD2B98BCD0D1FB00B023AD4547B0F5FAEE352CCC5BA26CD18E730A7C69CCB8E79DD5D13E0A079E002BA1791109476BD812F5E6329D6977FE3C8D6EAD4F3ADC91CDBBC58DD018389D605AACF66B3B5902A1; ceshi3.com=000; __jdu=1605755815875269445822; deviceid_pdj_jd=H5_DEV_92DD6F05-B71A-43D7-9790-529335C43AAC; __jdc=89149253; __jda=89149253.1605755815875269445822.1605755816.1605755816.1605764267.2; __jdb=89149253.1.1605755815875269445822|2.1605764267; _base_=YKH2KDFHMOZBLCUV7NSRBWQUJPBI7JIMU5R3EFJ5UDHJ5LCU7R2NILKK5UJ6GLA2RGYT464UKXAI4Z6HPCTN4UQM3WHVQ4ENFP57OC2NCIWTST4KDNCWZES6EV2TD5XDTCNE6YVKRXISVWNQHZDBO6QEKYXMXGPYGVEOCQCSG4SOQWCP5WPWO6EFS7HEHMRWVKBRVHB33TFD4AUHV3TOJD7MGBX53BNNP2E6MSSOORYGL5H2GYFRURR5ACFJ54GH7PTHFL22YL3C6ODFYFTWGV5UAWCX5C6J372TDCL6LDNEERERTGC3ZLDBOD6N56GYMJ3KG4FLVU4YHVQAQIWW3S2YBFMIMTF6SWAFAQ52UF5TATP7KZIQ; b-sec=S2JWP6CAFP7K44GG6BEY2DLMRHSHR25YQUFIV6U2MSDRFM72EUECXMEVQ2E3NEQXNRAQLGFZSXSFM - `) + api.SetCookie("thor", "5E1D1AE7BBC42FACA3496D9C54AF9F879CF4836860E75FF70BFCDEAC5A75C1C58EAB54F4C674330367C5A17888A4FB0BA1EA349F99E49B87787205B2F0BA715979DE02766356E7182C810344BB3A72ADD1F2C8CE8F88206E69A92C4B4F64C8A2FFA5A08FF31923DF3C659E8C9E3A4032816E7407ABE2463499AD76B83A3F78C662530B11F26052D1D195EF91E8C4A689") } diff --git a/platformapi/jdshopapi/sku.go b/platformapi/jdshopapi/sku.go index 13aff636..019b4eb6 100644 --- a/platformapi/jdshopapi/sku.go +++ b/platformapi/jdshopapi/sku.go @@ -41,35 +41,35 @@ type CreateSkuParamWare struct { MultiCategoryID int `json:"multiCategoryId,omitempty"` //否 无 末级类目ID BrandID int `json:"brandId"` //否 无 不同类目是否必填情况不同,若发布时提示[此类目要求品牌必填],则表示品牌需要必填。品牌ID获取方式通过商家授权类目接口获取。 // TemplateID int `json:"templateId"` // 否 无 发布时不可设置 - TransportID int `json:"transportId"` //是 无 运费模板ID - WareStatus int `json:"wareStatus"` // 否 新增仅可以使用 1:从未上架 8:在售(上架) 商品状态1:从未上架 2:自主下架 4:系统下架 8:在售 513:从未上架 待审核 514:自主下架 待审核 516:系统下架 待审核 520:在售 待审核 1025:从未上架 审核不通过 暂时没用 1026:自主下架 审核不通过 暂时没用 1028:系统下架 审核不通过 1032:在售 审核不通过 - OuterID string `json:"outerId"` // 否 无 商品外部ID,商家自行设置的ID(便于关联京东商品) + TransportID int `json:"transportId,omitempty"` //是 无 运费模板ID + WareStatus int `json:"wareStatus,omitempty"` // 否 新增仅可以使用 1:从未上架 8:在售(上架) 商品状态1:从未上架 2:自主下架 4:系统下架 8:在售 513:从未上架 待审核 514:自主下架 待审核 516:系统下架 待审核 520:在售 待审核 1025:从未上架 审核不通过 暂时没用 1026:自主下架 审核不通过 暂时没用 1028:系统下架 审核不通过 1032:在售 审核不通过 + OuterID string `json:"outerId,omitempty"` // 否 无 商品外部ID,商家自行设置的ID(便于关联京东商品) VenderID int `json:"venderId"` // Is7ToReturn int `json:"is7ToReturn"` // 0 不支持,1 支持7天, 2支持90天 // ItemNum string `json:"itemNum"` // 否 无 商品货号 // BarCode string `json:"barCode"` // 否 无 商品的条形码.UPC码,SN码,PLU码统称为条形码 // WareLocation int `json:"wareLocation"` // 否 无 商品产出地区 // Delivery int `json:"delivery"` // 否 无 商品发货地 - PromiseID int `json:"promiseId"` // 否 无 配送时效 + PromiseID int `json:"promiseId,omitempty"` // 否 无 配送时效 // adWords // 否 无 商品广告词对象 (单品页显示的优先级低于促销广告词) // Wrap string `json:"wrap"` //否 无 包装规格(已废弃) // PackListing string `json:"packListing"` // 否 无 商品包装清单 - Length int `json:"length"` // 否 无 商品长度,单位mm。根据类目区分 是 否必填 - Width int `json:"width"` // 否 无 商品宽度,单位mm。根据类目区分 是 否必填 - Height int `json:"height"` // 否 无 商品高度,单位mm。根据类目区分 是 否必填 - Weight float64 `json:"weight"` // 否 无 商品重量,单位kg。根据类目区分 是 否必填 + Length int `json:"length,omitempty"` // 否 无 商品长度,单位mm。根据类目区分 是 否必填 + Width int `json:"width,omitempty"` // 否 无 商品宽度,单位mm。根据类目区分 是 否必填 + Height int `json:"height,omitempty"` // 否 无 商品高度,单位mm。根据类目区分 是 否必填 + Weight float64 `json:"weight,omitempty"` // 否 无 商品重量,单位kg。根据类目区分 是 否必填 // Props []struct { // AttrID string `json:"attrID"` // 否 无 属性ID // AttrValues string `json:"attrValues"` //否 无 属性值ID数组 // } `json:"props"` // 否 无 属性列表(已废弃 请使用multiCateProps,已经按照类目限制使用3级类目修改,请及时迁移到多级类目) - Features []*CreateSkuParamFeatures `json:"features"` // 否 无 商品维度的特殊属性 目前两个特殊属性 IBS、FBP、FCS、SCF 4种商家类型【规格型号】 model和【销售单位】 unit 字段且为必填(如 个、盒、袋等)请勿填写公司名称。 - Images []*CreateSkuParamImages `json:"images"` // 是 无 商品图片列表,发布时必须有主图(颜色为十个0,index为1的图片) - ShopCategorys []int `json:"shopCategorys"` // 否 无 商品店内分类(商家接口获取到的最末级的分类) - MobileDesc string `json:"mobileDesc"` // 是 无 移动版的商品介绍 长度限制10W个字符 - Introduction string `json:"introduction"` // 是 无 PC版的商品介绍 长度限制10W个字符 + Features []*CreateSkuParamFeatures `json:"features,omitempty"` // 否 无 商品维度的特殊属性 目前两个特殊属性 IBS、FBP、FCS、SCF 4种商家类型【规格型号】 model和【销售单位】 unit 字段且为必填(如 个、盒、袋等)请勿填写公司名称。 + Images []*CreateSkuParamImages `json:"images"` // 是 无 商品图片列表,发布时必须有主图(颜色为十个0,index为1的图片) + ShopCategorys []int `json:"shopCategorys"` // 否 无 商品店内分类(商家接口获取到的最末级的分类) + MobileDesc string `json:"mobileDesc"` // 是 无 移动版的商品介绍 长度限制10W个字符 + Introduction string `json:"introduction"` // 是 无 PC版的商品介绍 长度限制10W个字符 // AfterSales string `json:"afterSales"` // 否 无 售后服务 - JdPrice float64 `json:"jdPrice"` // 否 无 商品的京东价,人民币单元 是元 - MarketPrice float64 `json:"marketPrice"` // 否 无 商品的市场价,人民币单元 是元 + JdPrice float64 `json:"jdPrice,omitempty"` // 否 无 商品的京东价,人民币单元 是元 + MarketPrice float64 `json:"marketPrice"` // 否 无 商品的市场价,人民币单元 是元 // ZhuangBaID string `json:"zhuangBaId"` // 否 无 商品描述装吧实例ID // IntroductionUseFlag string `json:"introductionUseFlag"` // 否 无 商品描述使用标识 ,0:使用默认的商品描述,1:使用装吧商详 // MobileZhuangBaID string `json:"mobileZhuangBaId"` // 否 无 移动版商品描述装吧实例ID @@ -78,7 +78,7 @@ type CreateSkuParamWare struct { // FitCaseHTMLApp string `json:"fitCaseHtmlApp"` // 否 无 装修案例移动版描述,装修类目才可填写 // FitCaseHTMLPc string `json:"fitCaseHtmlPc"` // 否 无 装修案例PC版描述,装修类目才可填写 // SpecialServices []string `json:"specialServices"` // 否 无 特色服务,装修类目才可填写,装修类必填,最大为5,每个值最长为8个字符 - MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps"` // 否 无 类目属性列表,类目属性中有必填项时,此字段必填;若未设置或设置错误,会有“通用属性必填”等错误提示! + MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps,omitempty"` // 否 无 类目属性列表,类目属性中有必填项时,此字段必填;若未设置或设置错误,会有“通用属性必填”等错误提示! } type CreateSkuParamFeatures struct { @@ -87,10 +87,12 @@ type CreateSkuParamFeatures struct { } type CreateSkuParamImages struct { - ColorID string `json:"colorId"` //是 无 颜色id,颜色id和您设置的销售属性值id对应,使用接口jingdong.category.read.findValuesByAttrIdUnlimit 获取 ,如果没销售属性,则默认为10个0(主图,并且主图必填) - ImgIndex int `json:"imgIndex"` //是 无 图片顺序。index值:1N,如果index存在,则直接覆盖相应index图片 - ImgURL string `json:"imgUrl"` //是 无 京东图片服务器地址,不包括前缀。例如:jfs/t2116/102/1731643157/81969/c3df941a/5670f868Nc441d4c3.jpg - ImgZoneID string `json:"imgZoneId"` //否 无 图片空间中的图片Id + ColorID string `json:"colorId"` //是 无 颜色id,颜色id和您设置的销售属性值id对应,使用接口jingdong.category.read.findValuesByAttrIdUnlimit 获取 ,如果没销售属性,则默认为10个0(主图,并且主图必填) + ImgIndex int `json:"imgIndex"` //是 无 图片顺序。index值:1N,如果index存在,则直接覆盖相应index图片 + ImgURL string `json:"imgUrl"` //是 无 京东图片服务器地址,不包括前缀。例如:jfs/t2116/102/1731643157/81969/c3df941a/5670f868Nc441d4c3.jpg + ImgZoneID string `json:"imgZoneId,omitempty"` //否 无 图片空间中的图片Id + Type string `json:"type,omitempty"` //"com.jd.pop.ware.ic.api.domain.sku" + Type2 string `json:"@type,omitempty"` } type CreateSkuParamSkus struct { @@ -106,22 +108,22 @@ type CreateSkuParamSkus struct { // StockNum string `json:"stockNum"` //是 无 总库存数 // BarCode string `json:"barCode"` //否 无 SKU的条形码 // } `json:"features"` //否 无 特殊属性 - JdPrice float64 `json:"jdPrice"` //是 无 京东价必填 单位:元 - OuterID string `json:"outerId"` //否 无 外部ID,系统不保证唯一性,如需唯一性自行保证 - StockNum int `json:"stockNum"` //是 无 总库存数 + JdPrice float64 `json:"jdPrice"` //是 无 京东价必填 单位:元 + OuterID string `json:"outerId,omitempty"` //否 无 外部ID,系统不保证唯一性,如需唯一性自行保证 + StockNum int `json:"stockNum"` //是 无 总库存数 // BarCode string `json:"barCode"` //否 无 SKU的条形码 // Props []struct{} `json:"props"` //否 无 SKU属性(已废弃 请使用multiCateProps,已经按照类目限制使用3级类目修改,请及时迁移到多级类目) - SaleAttrs []*CreateSkuParamAttrs `json:"saleAttrs"` //否 无 多级SKU属性,仅当属性可以下沉时才能设置,不验证必填!sku维度设置后,以sku上的属性为准! + SaleAttrs []*CreateSkuParamAttrs `json:"saleAttrs,omitempty"` //否 无 多级SKU属性,仅当属性可以下沉时才能设置,不验证必填!sku维度设置后,以sku上的属性为准! // Capacity string `json:"capacity"` // 否 20L 20T 容量,在有特殊要求的类目下必填!最多支持6位小数。 - Type string `json:"type"` //"com.jd.pop.ware.ic.api.domain.sku" - Type2 string `json:"@type"` - MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps"` // 否 无 类目属性列表,类目属性中有必填项时,此字段必填;若未设置或设置错误,会有“通用属性必填”等错误提示! + Type string `json:"type,omitempty"` //"com.jd.pop.ware.ic.api.domain.sku" + Type2 string `json:"@type,omitempty"` + MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps,omitempty"` // 否 无 类目属性列表,类目属性中有必填项时,此字段必填;若未设置或设置错误,会有“通用属性必填”等错误提示! } type CreateSkuParamAttrs struct { - // AttrValueAlias []string `json:"attrValueAlias,omitempty"` //否 无 值别名,发布商品时不可设置 - AttrID string `json:"attrId"` //是 无 下沉到sku的属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 获取 features字段中attrLevel=1 - AttrValues []string `json:"attrValues"` //是 无 下沉到sku属性值 单选或者多选 通过接口jingdong.category.read.findValuesByAttrIdUnlimit获取 输入类型请手动输入 + AttrValueAlias []string `json:"attrValueAlias,omitempty"` //否 无 值别名,发布商品时不可设置 + AttrID string `json:"attrId"` //是 无 下沉到sku的属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 获取 features字段中attrLevel=1 + AttrValues []string `json:"attrValues"` //是 无 下沉到sku属性值 单选或者多选 通过接口jingdong.category.read.findValuesByAttrIdUnlimit获取 输入类型请手动输入 } type CreateSkuParam struct { @@ -537,7 +539,7 @@ func (a *API) FindSkuById(skuId int64) (findSkuByIdParam *FindSkuByIdParam, err func (a *API) FindWareById(wareId int64) (err error) { _, err = a.AccessAPI2("jingdong.ware.read.findWareById", prodURL, map[string]interface{}{ "wareId": wareId, - "field": "features", + "field": "skus,features,weight,width,height,length,images,wareStatus,categoryId,brandId,colType", }) return err } @@ -627,3 +629,17 @@ func (a *API) SearchSkuList(pageNo, pageSize int) (list []*SearchSkuListResult, } return list, totalCount, err } + +//搜索sku +//https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1227&apiName=jingdong.sku.read.searchSkuList +func (a *API) SearchSkuList2(wareIDs []int) (list []*SearchSkuListResult, totalCount int, err error) { + result, err := a.AccessAPI2("jingdong.sku.read.searchSkuList", prodURL, map[string]interface{}{ + "wareId": wareIDs, + "field": "jdPrice,saleAttrs,stockNum", + }) + if err == nil { + utils.Map2StructByJson(result["jingdong_sku_read_searchSkuList_responce"].(map[string]interface{})["page"].(map[string]interface{})["data"], &list, false) + totalCount = int(utils.Interface2Int64WithDefault(result["jingdong_sku_read_searchSkuList_responce"].(map[string]interface{})["page"].(map[string]interface{})["totalItem"], 0)) + } + return list, totalCount, err +} diff --git a/platformapi/jdshopapi/sku_test.go b/platformapi/jdshopapi/sku_test.go index f45425bc..e3552a41 100644 --- a/platformapi/jdshopapi/sku_test.go +++ b/platformapi/jdshopapi/sku_test.go @@ -3,7 +3,6 @@ package jdshopapi import ( "bytes" "crypto/md5" - "encoding/json" "fmt" "image" "image/gif" @@ -104,35 +103,12 @@ func TestGetFeightMb(t *testing.T) { // t.Log(utils.Format4Output(result, false)) } -func TestAA(t *testing.T) { - ware := &CreateSkuParamWare{ - Title: "测试商品1", - ShopCategorys: []int{11}, - CategoryID: 13577, - TransportID: TransportID, - MobileDesc: "测试", - Introduction: "测试", - WareStatus: 8, - OuterID: "1", - Weight: 2300, - Height: 100, - Length: 100, - Width: 100, - JdPrice: 20, - MarketPrice: 10, - VenderID: 0, - BrandID: JxBrandId, - } - result, _ := json.Marshal(ware) - fmt.Println(string(result)) -} - func TestCreateSku(t *testing.T) { var images []*CreateSkuParamImages var skus []*CreateSkuParamSkus var attrs []*CreateSkuParamAttrs - var attrs2 []*CreateSkuParamAttrs - var attrs3 []*CreateSkuParamAttrs + // var attrs2 []*CreateSkuParamAttrs + // var attrs3 []*CreateSkuParamAttrs var features []*CreateSkuParamFeatures feature := &CreateSkuParamFeatures{ Key: "is7ToReturn", @@ -141,85 +117,87 @@ func TestCreateSku(t *testing.T) { features = append(features, feature) // desc = "aa" // desc := `
因生鲜比较脆弱,发货途中如果有磕碰损坏,请收到联系客服,闪电赔付。请核对好地址,发货后不可修改地址,因改地址导致损坏不能赔付,谢谢理解

因生鲜比较脆弱,发货途中如果有磕碰损坏,请收到联系客服,闪电赔付。请核对好地址,发货后不可修改地址,因改地址导致损坏不能赔付,谢谢理解

因生鲜比较脆弱,发货途中如果有磕碰损坏,请收到联系客服,闪电赔付。请核对好地址,发货后不可修改地址,因改地址导致损坏不能赔付,谢谢理解

aa
" image := &CreateSkuParamImages{ ColorID: "0000000000", ImgIndex: 1, - ImgURL: "jfs/t1/124185/34/1067/20460/5eb90d1aE2a81b6e4/ab451433f5e963b0.jpg", + ImgURL: "jfs/t1/142006/30/15024/504060/5fb636d4Ef12079f7/2adad323cbcf7c52.jpg", + // Type: "com.jd.pop.ware.ic.api.domain.image", + // Type2: "com.jd.pop.ware.ic.api.domain.Image", } images = append(images, image) ware.Images = images sku := &CreateSkuParamSkus{ - JdPrice: 10, - StockNum: 1, + JdPrice: 100, + StockNum: 100, Type: "com.jd.pop.ware.ic.api.domain.sku", Type2: "com.jd.pop.ware.ic.api.domain.Sku", - OuterID: "1", - } - sku2 := &CreateSkuParamSkus{ - JdPrice: 10, - StockNum: 1, - Type: "com.jd.pop.ware.ic.api.domain.sku", - Type2: "com.jd.pop.ware.ic.api.domain.Sku", - OuterID: "2", - } - attr1 := &CreateSkuParamAttrs{ - AttrID: "109692", - AttrValues: []string{"613613"}, + // OuterID: "1", } + // sku2 := &CreateSkuParamSkus{ + // JdPrice: 10, + // StockNum: 1, + // Type: "com.jd.pop.ware.ic.api.domain.sku", + // Type2: "com.jd.pop.ware.ic.api.domain.Sku", + // OuterID: "2", + // } + // attr1 := &CreateSkuParamAttrs{ + // AttrID: "109692", + // AttrValues: []string{"613613"}, + // } // attr2 := &CreateSkuParamAttrs{ // AttrID: "109897", // AttrValues: []string{"613771"}, // } - attr3 := &CreateSkuParamAttrs{ - AttrID: "160508", - AttrValues: []string{"0.5"}, - } + // attr3 := &CreateSkuParamAttrs{ + // AttrID: "160508", + // AttrValues: []string{"0.5"}, + // } attr4 := &CreateSkuParamAttrs{ - AttrID: "160781", - AttrValues: []string{"5"}, + AttrID: "140190", + AttrValues: []string{"730802"}, } - attr5 := &CreateSkuParamAttrs{ - AttrID: "1001027606", - AttrValues: []string{"2440273517"}, - } - attr6 := &CreateSkuParamAttrs{ - AttrID: "1001027606", - AttrValues: []string{"2440272539"}, - } - attrs = append(attrs, attr1) + // attr5 := &CreateSkuParamAttrs{ + // AttrID: "1000022043", + // AttrValues: []string{"2515313135"}, + // } + // attr6 := &CreateSkuParamAttrs{ + // AttrID: "1001027606", + // AttrValues: []string{"2440272539"}, + // } + // attrs = append(attrs, attr1) // attrs = append(attrs, attr2) - attrs = append(attrs, attr3) + // attrs = append(attrs, attr3) attrs = append(attrs, attr4) - attrs2 = append(attrs2, attr5) - attrs3 = append(attrs3, attr6) + // attrs2 = append(attrs2, attr5) + // attrs3 = append(attrs3, attr6) ware.MultiCateProps = attrs - sku2.SaleAttrs = attrs3 - sku.SaleAttrs = attrs2 + // sku2.SaleAttrs = attrs3 + // sku.SaleAttrs = attrs2 skus = append(skus, sku) - skus = append(skus, sku2) + // skus = append(skus, sku2) // ware.Skus = skus result, err := api.CreateWare(ware, skus) if err != nil { @@ -237,7 +215,7 @@ func TestFindVendorCategories(t *testing.T) { } func TestFindAttrs(t *testing.T) { - result, err := api.FindAttrs(15245) + result, err := api.FindAttrs(12247) if err != nil { t.Fatal(err) } @@ -245,7 +223,7 @@ func TestFindAttrs(t *testing.T) { } func TestFindValuesByAttrId(t *testing.T) { - result, no, err := api.FindValuesByAttrId(1001038262) + result, no, err := api.FindValuesByAttrId(1000022043) if err != nil { t.Fatal(err) } @@ -262,7 +240,7 @@ func TestSaveVenderAttrValue(t *testing.T) { } func TestDeleteWare(t *testing.T) { - err := api.DeleteWare(14518369562) + err := api.DeleteWare(10020528071531) if err != nil { t.Fatal(err) } @@ -360,7 +338,7 @@ func TestDeleteSku(t *testing.T) { } func TestFindSkuById(t *testing.T) { - result, err := api.FindSkuById(71538612626) + result, err := api.FindSkuById(10024685331653) if err != nil { t.Fatal(err) } @@ -407,7 +385,7 @@ func ConvertDistanceToLogLat(lng, lat, distance, angle float64) (newLng, newLat } func TestFindWareById(t *testing.T) { - err := api.FindWareById(14546096098) + err := api.FindWareById(10020528071531) if err != nil { t.Fatal(err) } @@ -440,21 +418,15 @@ func TestUpdateWareSaleAttrvalueAlias(t *testing.T) { } func TestSearchSkuList(t *testing.T) { - var jdsIDs = []int64{ - 70360362787, 70360943788, 70360811895, 70360582829, 70360415481, 70360967221, 70360686708, 70360712729, 70360775271, + result, _, err := api.SearchSkuList2([]int{10020528071531}) + if err != nil { + t.Fatal(err) } - for _, v := range jdsIDs { - api.DeleteSku(v) - } - // result, err := api.SearchSkuList(14518857091) - // if err != nil { - // t.Fatal(err) - // } - // t.Log(utils.Format4Output(result, false)) + t.Log(utils.Format4Output(result, false)) } func TestAAAAAA(t *testing.T) { - result, _, err := api.SearchSkuList(2, 20) + result, _, err := api.SearchSkuList(1, 20) if err != nil { t.Fatal(err) } diff --git a/platformapi/jdshopapi/store_page.go b/platformapi/jdshopapi/store_page.go index 9557fd51..1decce83 100644 --- a/platformapi/jdshopapi/store_page.go +++ b/platformapi/jdshopapi/store_page.go @@ -792,3 +792,196 @@ func (a *API) UploadImageNew(data []byte, fileName string) (jdURL string, err er } return jdURL, err } + +type WareSaveParam struct { + AdContent string `json:"adContent"` + AdContentURL string `json:"adContentUrl"` + AdContentWords string `json:"adContentWords"` + AvailableFeatures []interface{} `json:"availableFeatures"` + BrandID int `json:"brandId"` + CatIDLevel1 int `json:"catIdLevel1"` + CatIDLevel2 int `json:"catIdLevel2"` + CatIDLevel4 int `json:"catIdLevel4"` + CategoryID int `json:"categoryId"` + CharacteristicService []interface{} `json:"characteristicService"` + ColType int `json:"colType,omitempty"` + CostPrice string `json:"costPrice"` + Delivery int `json:"delivery"` + DeliveryID1 int `json:"deliveryId1"` + Density string `json:"density"` + DesignConcept string `json:"designConcept"` + ExtendFeatures []interface{} `json:"extendFeatures"` + Features []WareSaveSkusFea `json:"features,omitempty"` + FitmentNote string `json:"fitmentNote"` + FitmentNoteMobile string `json:"fitmentNoteMobile"` + HasWareBoot bool `json:"hasWareBoot"` + Height int `json:"height"` + HouseInfo struct { + Address struct { + AreaCode int `json:"areaCode"` + AreaName string `json:"areaName"` + CityCode int `json:"cityCode"` + CityName string `json:"cityName"` + Detail string `json:"detail"` + Img string `json:"img"` + Lat int `json:"lat"` + Lng int `json:"lng"` + ProvinceCode int `json:"provinceCode"` + ProvinceName string `json:"provinceName"` + } `json:"address"` + AvgPrice int `json:"avgPrice"` + Characteristics string `json:"characteristics"` + ExtentImgMap interface{} `json:"extentImgMap"` + Flag int `json:"flag"` + PresaleList []interface{} `json:"presaleList"` + TotalPrice int `json:"totalPrice"` + } `json:"houseInfo"` + ImageMap struct { + Num0000000000 []CreateSkuParamImages `json:"0000000000"` + } `json:"imageMap"` + ImgAgreementSelected bool `json:"imgAgreementSelected"` + IntroductionUseFlag string `json:"introductionUseFlag"` + Is7ToReturn int `json:"is7ToReturn"` + IsAllChannel bool `json:"isAllChannel"` + IsLoc int `json:"isLoc"` + IsLocSwitch int `json:"isLocSwitch"` + IsOperateInvoice int `json:"isOperateInvoice"` + IsRentWare int `json:"isRentWare"` + IsTaxCheap int `json:"isTaxCheap"` + ItemNum string `json:"itemNum"` + JdPrice int `json:"jdPrice"` + LastCategoryID int `json:"lastCategoryId"` + Length int `json:"length"` + LocAreaID1 int `json:"locAreaId1"` + LocMatchInfoVO struct { + ActivitiesIllustration string `json:"activitiesIllustration"` + ActivityAgreement int `json:"activityAgreement"` + ActivityBegin string `json:"activityBegin"` + ActivityEnd string `json:"activityEnd"` + AddressID int `json:"addressId"` + Coordinate string `json:"coordinate"` + DetailAddress string `json:"detailAddress"` + RegistrationField int `json:"registrationField"` + VenderID int `json:"venderId"` + WareID int `json:"wareId"` + } `json:"locMatchInfoVO"` + MainImg string `json:"mainImg"` + MarkSource int `json:"markSource"` + MarketPrice int `json:"marketPrice"` + MobileDesc string `json:"mobileDesc"` + MobileDescUseFlag string `json:"mobileDescUseFlag"` + MobileZhuangBaID string `json:"mobileZhuangBaId"` + MoreImage bool `json:"moreImage"` + MultiCateProps []interface{} `json:"multiCateProps"` + Notes string `json:"notes"` + OptionType int `json:"optionType"` + OutTime string `json:"outTime"` + OuterID string `json:"outerId"` + PackListing string `json:"packListing"` + PayType string `json:"payType"` + PromiseID int `json:"promiseId"` + PromiseTemplateType int `json:"promiseTemplateType"` + PropsSet []interface{} `json:"propsSet"` + PutawayTime string `json:"putawayTime"` + PwMarketingLabelVo struct { + IsRequestSku bool `json:"isRequestSku"` + PwBdsLabelBindVos []interface{} `json:"pwBdsLabelBindVos"` + PwBdsProposalVos []interface{} `json:"pwBdsProposalVos"` + RelationID int `json:"relationId"` + } `json:"pwMarketingLabelVo"` + QcReports interface{} `json:"qcReports"` + Rate string `json:"rate"` + RentSpuVO struct { + CreateTime interface{} `json:"createTime"` + PlotID int `json:"plotId"` + PlotInfo interface{} `json:"plotInfo"` + SkuList []interface{} `json:"skuList"` + SpuBroker interface{} `json:"spuBroker"` + SpuID int `json:"spuId"` + SpuName string `json:"spuName"` + StaffID int `json:"staffId"` + UpdateTime interface{} `json:"updateTime"` + } `json:"rentSpuVO"` + SaleAttrs []interface{} `json:"saleAttrs"` + Service string `json:"service"` + ServiceDesc string `json:"serviceDesc"` + ServiceFeeID int `json:"serviceFeeId"` + ShopCategorys []int `json:"shopCategorys"` + SkuJSON string `json:"skuJson"` + Skus []WareSaveSkus `json:"skus"` + TaxCheapContent string `json:"taxCheapContent"` + TaxCode string `json:"taxCode"` + TaxRate int `json:"taxRate"` + TempID string `json:"tempId"` + TemplateID int `json:"templateId"` + Title string `json:"title"` + ToUsePrice string `json:"toUsePrice"` + TransparentImageAudit []interface{} `json:"transparentImageAudit"` + TransparentImageMap struct { + } `json:"transparentImageMap"` + TransportID int `json:"transportId"` + UpcCode string `json:"upcCode"` + VenderID int `json:"venderId"` + WareID int64 `json:"wareId"` + WareLocation string `json:"wareLocation"` + WareStatus int `json:"wareStatus"` + WareStatusStr string `json:"wareStatusStr"` + Weight string `json:"weight"` + Wide int `json:"wide"` + ZeroTaxRate int `json:"zeroTaxRate"` + ZhuangBaID string `json:"zhuangBaId"` + ZhuangBaIntroduction string `json:"zhuangBaIntroduction"` + ZhuangBaMobileDesc string `json:"zhuangBaMobileDesc"` +} + +type WareSaveSkusFea struct { + Cn string `json:"cn"` + Key string `json:"key"` + Value string `json:"value"` +} + +type WareSaveSkusProp struct { + AttrID int `json:"attrId"` + AttrValues int64 `json:"attrValues"` + AttrValueAlias string `json:"attrValueAlias"` +} + +type WareSaveSkus struct { + Props []WareSaveSkusProp `json:"props"` + Features []interface{} `json:"features"` + SkuID int64 `json:"skuId,omitempty"` + JdPrice string `json:"jdPrice"` + OuterID string `json:"outerId"` + StockNum int `json:"stockNum"` + RentDeposit string `json:"rentDeposit"` + RentUnit string `json:"rentUnit"` + RentServiceDay string `json:"rentServiceDay"` + SkuProps []interface{} `json:"skuProps"` + Plu string `json:"plu"` + Capacity interface{} `json:"capacity"` +} + +type WareSaveResult struct { + SkuID int64 `json:"skuId"` + VenderID int `json:"venderId"` + WareID int64 `json:"wareId"` + Props []struct { + AttrID string `json:"attrId"` + AttrValues string `json:"attrValues"` + AttrValueAlias string `json:"attrValueAlias"` + } `json:"props"` + JdPrice float64 `json:"jdPrice"` + OuterID string `json:"outerId"` + StockNum int `json:"stockNum"` +} + +//创建商品 +//https://porder.shop.jd.com/order/orderlist/allOrders +func (a *API) WareSave(wareSaveParam *WareSaveParam) (wareSaveResult []*WareSaveResult, err error) { + params := utils.Struct2FlatMap(wareSaveParam) + result, err := a.AccessStorePage2("https://ware.shop.jd.com/rest/shop/ware/save", params, true) + if err == nil { + utils.Map2StructByJson(result["data"].(map[string]interface{})["skus"], &wareSaveResult, false) + } + return wareSaveResult, err +} diff --git a/platformapi/jdshopapi/store_page_test.go b/platformapi/jdshopapi/store_page_test.go index db53401d..4882c60f 100644 --- a/platformapi/jdshopapi/store_page_test.go +++ b/platformapi/jdshopapi/store_page_test.go @@ -6,7 +6,6 @@ import ( "crypto/cipher" "encoding/base64" "fmt" - "strings" "testing" "git.rosy.net.cn/baseapi/utils" @@ -191,9 +190,9 @@ func TestUploadImageNew(t *testing.T) { // t.Fatal(err) // } // t.Log(utils.Format4Output(result, false)) - str := "京西菜市松林农贸市场.生鲜店" - str2 := str[0:strings.Index(str, ".")] + str[strings.Index(str, ".")+1:len(str)] - fmt.Println(str2) + // str := "京西菜市松林农贸市场.生鲜店" + // str2 := str[0:strings.Index(str, ".")] + str[strings.Index(str, ".")+1:len(str)] + fmt.Println(2 % 4) } func TestShopList(t *testing.T) { @@ -203,3 +202,66 @@ func TestShopList(t *testing.T) { } t.Log(utils.Format4Output(result, false)) } + +func TestWareSave(t *testing.T) { + desc := `因生鲜比较脆弱,发货途中如果有磕碰损坏,请收到联系客服,闪电赔付。请核对好地址,发货后不可修改地址,因改地址导致损坏不能赔付,谢谢理解
