diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index 4e2d69aa9..ae1125667 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -1,6 +1,7 @@ package tiktok_store import ( + "errors" "fmt" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" freightTemplate_create_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/freightTemplate_create/request" @@ -8,7 +9,9 @@ import ( product_detail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_detail/response" product_editV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2/request" shop_bindStoreFreight_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreFreight/request" + shop_bindStoreSaleLimit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreSaleLimit/request" sku_editPrice_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_editPrice/request" + trade_createTradeLimitTemplate_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/trade_createTradeLimitTemplate/request" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -254,11 +257,10 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v // 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义 // 抖店的商品只管创建,创建接口会返回成功,但是审核的时候不一定成功.当前系统无法判定此商品是否已经创建过了! func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isCreate bool) (failedList []*partner.StoreSkuInfoWithErr, err error) { + globals.SugarLogger.Debug("==============vendorStoreID", vendorStoreID) var syncType string storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, "") api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID) - globals.SugarLogger.Debug("=============", storeDetail.VendorOrgCode) - globals.SugarLogger.Debugf("api===============%v", utils.Format4Output(api, false)) freightId, _ := api.GetStoreBindTemp(utils.Str2Int64(vendorStoreID)) if freightId == 0 { // 创建门店运费模板 @@ -291,13 +293,12 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI if isCreate { syncType = "创建商品" for _, storeSku := range storeSkuList { - // 创建商品 + // 创建子商品 param := &product_addV2_request.ProductAddV2Param{ CategoryLeafId: utils.Str2Int64(storeSku.SkuVendorMapCatID), Name: storeSku.Name, PayType: tiktokShop.TiktokPayType1, ReduceType: tiktokShop.SkuReduceTypePayMakeOrder, - FreightId: freightId, Weight: utils.Int2Float64(storeSku.Weight), DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay, PresellType: tiktokShop.SendGoodsTypeNow, @@ -309,10 +310,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI SellChannel: []int64{0}, StartSaleType: 0, PickupMethod: "0", - StoreId: int64(storeSku.StoreID), - MainProductId: int64(storeSku.NameID), } - + // param.AccountTemplateId = "" // 获取上传图,商品轮播图 img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) if err != nil { @@ -335,8 +334,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } // spec_prices - param.SpecPrices = GetSpecPrices(param.Specs, storeSku) - // ProductFormatNew + param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) + // ProductFormatNew 获取商品属性 productFormatNew, err := GetProductFormatNew(param.CategoryLeafId, storeDetail.VendorOrgCode) globals.SugarLogger.Debug("创建=============productFormatNew", productFormatNew) globals.SugarLogger.Debug("创建=============productFormatNew err", err) @@ -344,15 +343,44 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI return nil, err } param.ProductFormatNew = productFormatNew + globals.SugarLogger.Debug("创建=============param", utils.Format4Output(param, false)) - // 抖店创建商品 - tiktokResult, err := api.CreateStoreCommodity(param) + // 获取品牌 + brandID, err := api.GetSkuBrand(param.CategoryLeafId) + if err != nil { + return nil, err + } + param.StandardBrandId = brandID + + tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品 if err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } - storeSku.VendorSkuID = utils.Int64ToStr(tiktokResult.ProductId) + globals.SugarLogger.Debugf("tiktokResult main ===%s", utils.Format4Output(tiktokResult, false)) + + // 创建子商品 + param.FreightId = freightId + param.MainProductId = tiktokResult.ProductId + param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResult.ProductId, storeSku) + // 获取门店限售模板 + saleLimitId, err := CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) + globals.SugarLogger.Debug("==22213123131231231", saleLimitId) + if err != nil { + return nil, err + } + param.SaleLimitId = saleLimitId + param.StoreId = utils.Str2Int64(vendorStoreID) + // 抖店创建商品 + globals.SugarLogger.Debugf("zishangping=============%s", utils.Format4Output(param, false)) + tiktokResultChildren, err := api.CreateStoreCommodity(param) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + continue + } + storeSku.VendorSkuID = utils.Int64ToStr(tiktokResultChildren.ProductId) } } else { syncType = "更新商品" @@ -401,7 +429,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } // spec_prices - param.SpecPrices = GetSpecPrices(param.Specs, storeSku) + param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) // ProductFormatNew productFormatNew, err := GetProductFormatNew(param.CategoryLeafId, storeDetail.VendorOrgCode) globals.SugarLogger.Debug("更新=============productFormatNew", productFormatNew) @@ -427,6 +455,57 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI return failedList, err } +// CreateSaleTemp 创建限售模板 +func CreateSaleTemp(storeId int64, api *tiktokShop.API) (int64, error) { + // 获取限售模板 + saleLimitId, _ := api.StoreQuerySaleLimitTemp(storeId) + globals.SugarLogger.Debug("==========saleLimitId1", saleLimitId) + if saleLimitId != 0 { + return saleLimitId, nil + } + + // 创建限售模板 + param := &trade_createTradeLimitTemplate_request.TradeCreateTradeLimitTemplateParam{ + StoreId: storeId, + TradeLimitRuleRequestList: []trade_createTradeLimitTemplate_request.TradeLimitRuleRequestListItem{}, + } + tradeLimitRuleRequestList := make([]trade_createTradeLimitTemplate_request.TradeLimitRuleRequestListItem, 0) + tradeLimitRuleRequest := trade_createTradeLimitTemplate_request.TradeLimitRuleRequestListItem{ + TradeLimitModel: 1, // 限购模型 1-重量,2-数量,3-地区,4-金额 + TradeLimitResource: 2, // 限购资源类别1-抖店,2-门店,3-商品ID,4-sku,5-类目,6-活动,7-商品标 + TradeLimitResourceObject: nil, + TradeLimitPattern: &trade_createTradeLimitTemplate_request.TradeLimitPattern{ + Minimum: 1, // 1毫克 + Maximum: 500 * 1000 * 1000, //500千克 + CumulativeMax: 99999, + }, + TimePeriod: nil, + TradeLimitSubjectList: []int32{1}, + } + tradeLimitRuleRequestList = append(tradeLimitRuleRequestList, tradeLimitRuleRequest) + result, err := api.CreateTradeLimitTemplate(param) + globals.SugarLogger.Debug("==========err2222", err) + globals.SugarLogger.Debug("==========result222", utils.Format4Output(result, false)) + if err != nil { + return 0, err + } + + if result.TradeLimitId == 0 { + return 0, errors.New("限售模板创建错误,联系管理员") + } + + // 绑定限售模板 + if err := api.BindStoreSaleLimit(&shop_bindStoreSaleLimit_request.ShopBindStoreSaleLimitParam{ + StoreId: storeId, + SaleLimitId: result.TradeLimitId, + }); err != nil { + globals.SugarLogger.Debug("==========BindStoreSaleLimit", err) + return 0, err + } + + return result.TradeLimitId, nil +} + func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { if globals.EnableDdStoreWrite { for _, v := range storeSkuList { diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index f2136fbe0..023ef0f5e 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -15,6 +15,7 @@ import ( // GetProductFormatNew 获取物品属性 func GetProductFormatNew(categoryLeftId int64, vendorOrgCode string) (string, error) { category, err := getAPI(vendorOrgCode, 0, "").GetCatePropertyV2(categoryLeftId) + globals.SugarLogger.Debug("========productFormatNewDATA==============", utils.Format4Output(category, false)) if err != nil { return "", err } @@ -26,7 +27,7 @@ func GetProductFormatNew(categoryLeftId int64, vendorOrgCode string) (string, er Name: d.Name, DiyType: v.DiyType, } - format[utils.Int64ToStr(v.CategoryId)] = append(format[utils.Int64ToStr(v.CategoryId)], formateNew) + format[utils.Int64ToStr(v.PropertyId)] = append(format[utils.Int64ToStr(v.CategoryId)], formateNew) } } productFormatNew, err := json.Marshal(format) @@ -67,7 +68,7 @@ func GetTiktokImgList(storeId, appOrgCode string, img ...string) (string, error) } // GetSpecPrices 解析属性和规格参数 -func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { +func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSkuSyncInfo) string { skuSize := make([]*tiktokShop.SpecDetailList, 0, 0) detail1 := strings.Split(specs, "^") if len(detail1) > 3 { @@ -79,7 +80,6 @@ func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { for i := 0; i < len(name1); i++ { sku := &tiktokShop.SpecDetailList{ SpecDetailName1: name1[i], - StockNum: localSku.Stock, Price: int(localSku.VendorPrice), Code: utils.Int2Str(localSku.SkuID), StepStockNum: 0, @@ -89,6 +89,13 @@ func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, }, } + if mainSkuId == 0 { + sku.StockNum = 0 + } else { + sku.StockNum = 0 + sku.SkuType = 1 + sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} + } skuSize = append(skuSize, sku) } case 2: @@ -99,7 +106,6 @@ func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { sku := &tiktokShop.SpecDetailList{ SpecDetailName1: name1[i], SpecDetailName2: name2[j], - StockNum: localSku.Stock, Price: int(localSku.UnitPrice), Code: utils.Int2Str(localSku.SkuID), StepStockNum: 0, @@ -109,6 +115,13 @@ func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, }, } + if mainSkuId == 0 { + sku.StockNum = 0 + } else { + sku.StockNum = 0 + sku.SkuType = 1 + sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} + } skuSize = append(skuSize, sku) } } @@ -123,7 +136,6 @@ func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { SpecDetailName1: name1[i], SpecDetailName2: name2[j], SpecDetailName3: name3[k], - StockNum: localSku.Stock, Price: int(localSku.UnitPrice), Code: utils.Int2Str(localSku.SkuID), StepStockNum: 0, @@ -133,6 +145,13 @@ func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string { {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, }, } + if mainSkuId == 0 { + sku.StockNum = 0 + } else { + sku.StockNum = 0 + sku.SkuType = 1 + sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} + } skuSize = append(skuSize, sku) } }