Files
baseapi/platformapi/tiktok_shop/tiktok_api/sku.go
邹宗楠 abe51e130d 1
2022-11-09 14:35:32 +08:00

400 lines
15 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package tiktok_api
import (
"errors"
"fmt"
brand_list_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/brand_list/request"
order_batchDecrypt_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_batchDecrypt/request"
order_batchSensitive_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_batchSensitive/request"
product_addV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_addV2/request"
product_addV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_addV2/response"
product_del_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_del/request"
product_detail_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_detail/request"
product_detail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_detail/response"
product_detail_request_out "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_detail_out_productId/request"
product_editV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2/request"
product_editV2_commit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2_commit/request"
product_getCatePropertyV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_getCatePropertyV2/request"
product_getCatePropertyV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_getCatePropertyV2/response"
product_listV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/request"
product_listV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/response"
product_setOffline_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_setOffline/request"
shop_getShopCategory_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_getShopCategory/request"
sku_editPrice_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_editPrice/request"
sku_syncStock_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_syncStock/request"
sku_syncStockBatch_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_syncStockBatch/request"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
)
// UpdateSkuStock
// 1、支持修改普通库存,区域库存,阶梯库存
// 2、支持增量更新当incremental=true时idempotent_id字段参数必传。例原商品库存是10个接口传入5个执行成功商品库存是15个。
// 3、支持全量更新。例原商品库存是10个接口传入5个执行成功商品库存是5个。
// 4、可以设置库存为0
// 5、超市小时达店铺类型更新库存out_warehouse_id= store_id门店id表示更新门店商品库存。
func (a *API) UpdateSkuStock(param *sku_syncStock_request.SkuSyncStockParam) error {
request := sku_syncStock_request.New()
request.Param = param
resp, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("更新区域库存=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("更新区域库存:=%s", utils.Format4Output(resp, false))
if err != nil {
return err
}
if resp.Code != RequestSuccessCode {
return errors.New(resp.Msg)
}
return nil
}
// GetShopCategory 获取商品类目
// 请一定使用最小层级类目id发布商品或更新商品。
// 接口使用注意点:
// 1、第一次请求cid=0获取所有一级类目
// 2、先判断enable=true如果enable=false表示该类目已经失效请勿使用。
// 3、循环获取最小层级类目id方式再判断is_leaf=true或false。is_leaf=true表示是叶子节点最小层级类目id。is_leaf=false表示不是子节点请求参数cid=上一次响应参数id直到获取最小层级类目id。
func (a *API) GetShopCategory(cid int64) ([]*RetailCategoryInfo, error) {
// 如果cid为0,则获取所有的分类,如果cid不为0,则获取该分类下面的所有子分类
request := shop_getShopCategory_request.New()
param := request.GetParams()
param.Cid = cid
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("获取类目id=========:%s", request.GetUrlPath())
//globals.SugarLogger.Debugf("获取类目id:=%s", utils.Format4Output(result, false))
if err != nil {
return nil, err
}
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}
categoryAll := make([]*RetailCategoryInfo, 0, 0)
for i := 0; i < len(result.Data); i++ {
if result.Data[i].Enable != true { // 失效了
continue
}
if result.Data[i].IsLeaf == false {
categoryAll = append(categoryAll, &RetailCategoryInfo{
DataItem: result.Data[i],
Children: make([]*RetailCategoryInfo, 0, 0),
})
parentNode, _ := a.GetShopCategory(result.Data[i].Id)
categoryAll[i].Children = append(categoryAll[i].Children, parentNode...)
} else {
node := RetailCategoryInfo{
DataItem: result.Data[i],
Children: nil,
}
categoryAll = append(categoryAll, &node)
}
}
return categoryAll, nil
}
// GetCatePropertyV2 根据商品分类获取对应的属性列表
// 参数为最终的子节点id下面再无子节点
func (a *API) GetCatePropertyV2(categoryLeftId int64) (*product_getCatePropertyV2_response.ProductGetCatePropertyV2Response, error) {
request := product_getCatePropertyV2_request.New()
param := request.GetParams()
param.CategoryLeafId = categoryLeftId
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("根据类目id获取子节点属性=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("根据类目id获取子节点属性:=%s", utils.Format4Output(result, false))
globals.SugarLogger.Debugf("根据类目id获取参数:=%d", categoryLeftId)
if err != nil {
return nil, err
}
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}
return result, nil
}
// CreateStoreCommodity (新增总部商品)
func (a *API) CreateStoreCommodity(skuParam *product_addV2_request.ProductAddV2Param) (*product_addV2_response.ProductAddV2Data, error) {
request := product_addV2_request.New()
request.Param = skuParam
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("新增商品=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("新增商品:=%s", utils.Format4Output(result, false))
globals.SugarLogger.Debugf("参数详情:=%s", utils.Format4Output(skuParam, false))
if err != nil {
return nil, err
}
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}
return result.Data, nil
}
// SyncStockBatch 库存批量同步
func (a *API) SyncStockBatch(param *sku_syncStockBatch_request.SkuSyncStockBatchParam) error {
request := sku_syncStockBatch_request.New()
request.Param = param
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("库存同步=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("库存同步:=%s", utils.Format4Output(result, false))
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// EditStoreCommodity 编辑商品
func (a *API) EditStoreCommodity(sku *product_editV2_request.ProductEditV2Param) error {
request := product_editV2_request.New()
request.Param = sku
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("编辑门店=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("编辑门店============%s", utils.Format4Output(result, false))
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// EditStoreCommodityCommit 上架商品
func (a *API) EditStoreCommodityCommit(sku *product_editV2_commit_request.ProductEditV2Param2) error {
request := product_editV2_commit_request.New()
request.Param = sku
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("商品上架=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("商品上架:=%s", utils.Format4Output(result, false))
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// DeleteStoreCommodity 删除商品
func (a *API) DeleteStoreCommodity(productId int64) error {
request := product_del_request.New()
param := request.GetParams()
param.ProductId = productId
param.DeleteForever = true
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("删除商品=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("删除商品:=%s", utils.Format4Output(result, false))
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// ProductSetOffline 商品上下架
func (a *API) ProductSetOffline(productId int64) error {
request := product_setOffline_request.New()
param := request.GetParams()
param.ProductId = productId
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("商品下架=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("商品下架:=%s", utils.Format4Output(result, false))
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// GetSkuDetail 查询单个商品详情(这个只有抖店平台商品id有效)
func (a *API) GetSkuDetail(productId, outProductId string) (*product_detail_response.ProductDetailData, error) {
request := product_detail_request.New()
param := request.GetParams()
if productId != "" {
param.ProductId = productId
}
if outProductId != "" {
//param.OutProductId = outProductId
}
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("获取商品详情=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("获取商品详情:=%s", utils.Format4Output(result, false))
if err != nil {
return nil, err
}
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}
return result.Data, nil
}
// GetSkuDetailLocalID 查询单个商品详情(这个只有京西平台商品id有效)
func (a *API) GetSkuDetailLocalID(productId, outProductId string) (*product_detail_response.ProductDetailData, error) {
request := product_detail_request_out.New()
param := request.GetParams()
if outProductId != "" {
param.OutProductId = outProductId
}
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("获取商品详情=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("获取商品详情:=%s", utils.Format4Output(result, false))
if err != nil {
return nil, err
}
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}
return result.Data, nil
}
// GetSkuDetailList 批量获取商品列表
func (a *API) GetSkuDetailList(param *product_listV2_request.ProductListV2Param) (*product_listV2_response.ProductListV2Data, error) {
request := product_listV2_request.New()
request.Param = param
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("批量获取商品=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("批量获取商品:=%s", utils.Format4Output(result, false))
if err != nil {
return nil, err
}
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}
return result.Data, nil
}
// EditPrice 编辑商品价格
func (a *API) EditPrice(skuPrice *sku_editPrice_request.SkuEditPriceParam) error {
request := sku_editPrice_request.New()
request.Param = skuPrice
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("修改商品价格=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("修改商品价格:=%s", utils.Format4Output(result, false))
globals.SugarLogger.Debugf("修改商品参数:=%s", utils.Format4Output(skuPrice, false))
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// GetSkuBrand 获取商品所属品牌
func (a *API) GetSkuBrand(categoryId int64) (int64, error) {
request := brand_list_request.New()
request.Param.CategoryId = categoryId
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("获取商品所属品牌=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("获取商品所属品牌:=%s", utils.Format4Output(result, false))
if err != nil {
return 0, err
}
if result.Code != RequestSuccessCode {
return 0, errors.New(result.SubMsg)
}
if result.Data == nil || len(result.Data.AuthBrandList) == 0 {
return 596120136, nil // 无品牌默认值
}
return result.Data.AuthBrandList[0].BrandId, nil
}
// OrderUserInfoDecrypt 用户信息解密
func (a *API) OrderUserInfoDecrypt(orderId, name, tel, address string) (string, string, string, error) {
request := order_batchDecrypt_request.New()
cipherInfos := make([]order_batchDecrypt_request.CipherInfosItem, 0, 0)
for i := 1; i <= 3; i++ {
cipher := order_batchDecrypt_request.CipherInfosItem{}
cipher.AuthId = orderId
switch i {
case 1: // 姓名
cipher.CipherText = name
cipherInfos = append(cipherInfos, cipher)
case 2: // 手机号
cipher.CipherText = tel
cipherInfos = append(cipherInfos, cipher)
case 3: // 地址
cipher.CipherText = address
cipherInfos = append(cipherInfos, cipher)
}
}
request.Param.CipherInfos = cipherInfos
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("用户信息解密=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("用户信息解密:=%s", utils.Format4Output(result, false))
if err != nil {
return "", "", "", err
}
if result.Code != RequestSuccessCode {
return "", "", "", errors.New(result.SubCode)
}
var (
userName, userTel, userAddress = "", "", ""
)
for _, v := range result.Data.DecryptInfos {
if v.CipherText != "" && v.CipherText == name {
userName = v.DecryptText
}
if v.CipherText != "" && v.CipherText == tel {
userTel = v.DecryptText
}
if v.CipherText != "" && v.CipherText == address {
userAddress = v.DecryptText
}
}
return userName, userTel, userAddress, err
}
// OrderUserInfoSensitive 用户信息脱敏
func (a *API) OrderUserInfoSensitive(orderId, name, tel, address string) {
request := order_batchSensitive_request.New()
paramItems := make([]order_batchSensitive_request.CipherInfosItem, 0, 0)
for i := 0; i < 3; i++ {
cipher := order_batchSensitive_request.CipherInfosItem{}
cipher.AuthId = orderId
switch i {
case 1: // 姓名
cipher.CipherText = name
paramItems = append(paramItems, cipher)
case 2: // 手机号
cipher.CipherText = tel
paramItems = append(paramItems, cipher)
case 3: // 地址
cipher.CipherText = address
paramItems = append(paramItems, cipher)
}
}
request.Param.CipherInfos = paramItems
result, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debugf("用户信息脱敏=========:%s", request.GetUrlPath())
globals.SugarLogger.Debugf("用户信息脱敏:=%s", utils.Format4Output(result, false))
fmt.Println(err)
}