From bb5b7d8cebcd951d6a04529739011baa96e7daf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 9 Nov 2022 10:15:40 +0800 Subject: [PATCH 1/3] 1 --- business/partner/purchase/tiktok_store/order_afs_utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/business/partner/purchase/tiktok_store/order_afs_utils.go b/business/partner/purchase/tiktok_store/order_afs_utils.go index 5baf4fce4..1e8a3406d 100644 --- a/business/partner/purchase/tiktok_store/order_afs_utils.go +++ b/business/partner/purchase/tiktok_store/order_afs_utils.go @@ -117,10 +117,10 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * } if msgId == tiktokShop.CallbackUpdateRefundOrderMsgTagId { _, err = dao.DeleteEntity(dao.GetDB(), afsOrder, "VendorOrderID", "VendorID") - globals.SugarLogger.Debugf("err1============== %s", err.Error()) + globals.SugarLogger.Debugf("err1============== %v", err) afsOrder.Skus[0].VendorOrderID = afsOrder.VendorOrderID _, err = dao.DeleteEntity(dao.GetDB(), afsOrder.Skus[0], "VendorOrderID") - globals.SugarLogger.Debugf("err2============== %s", err.Error()) + globals.SugarLogger.Debugf("err2============== %v", err) } err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } From 415fbd445ce1d2fe32b5147f85ddb16fc63c826a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 9 Nov 2022 13:49:13 +0800 Subject: [PATCH 2/3] 1 --- business/jxstore/cms/sync.go | 1 + business/jxstore/cms/sync_store_sku.go | 12 ++++ business/model/dao/store_sku.go | 1 + .../purchase/tiktok_store/order_afs_utils.go | 3 - .../purchase/tiktok_store/store_sku2_utils.go | 57 ++++++++++++++----- controllers/cms_sync.go | 2 + 6 files changed, 59 insertions(+), 17 deletions(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 6fee59e90..721c52656 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -496,6 +496,7 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v // func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) { isManageIt := len(storeIDs) != 1 || len(skuIDs) == 0 || len(skuIDs) > 8 + globals.SugarLogger.Debugf("============2") funcParam := func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index e092d8098..afa4d4c55 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -103,6 +103,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo } } if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除 4 + globals.SugarLogger.Debugf("============5:删除") if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) { err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level) if err != nil && handler.IsErrCategoryNotExist(err) { @@ -112,6 +113,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo } } } else if model.IsSyncStatusNew(catInfo.CatSyncStatus) { // 新增 2 + globals.SugarLogger.Debugf("============6:新增") err = handler.CreateStoreCategory(ctx, storeID, vendorStoreID, catInfo) if err != nil && handler.IsErrCategoryExist(err) { if cat, err2 := handler.GetStoreCategory(ctx, storeID, vendorStoreID, catInfo.Name); err2 == nil { @@ -129,6 +131,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo // } } } else if model.IsSyncStatusUpdate(catInfo.CatSyncStatus) { // 修改 1 + globals.SugarLogger.Debugf("============7:修改") err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo) if err == nil { updateFields = append(updateFields, idFieldName) @@ -173,6 +176,7 @@ func SyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag } func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isAsync, isContinueWhenError bool) (hint string, err error) { + globals.SugarLogger.Debugf("============4") singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) if singleStoreHandler != nil { // 本地创建商品分类 if err = CreateStoreCategoryByStoreSku(ctx, vendorID, storeID, vendorStoreID, nameIDs, skuIDs); err != nil { @@ -671,6 +675,14 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag // } } + globals.SugarLogger.Debugf("============createList := %s", utils.Format4Output(createList, false)) + globals.SugarLogger.Debugf("============updateList := %s", utils.Format4Output(updateList, false)) + globals.SugarLogger.Debugf("============deleteList := %s", utils.Format4Output(deleteList, false)) + globals.SugarLogger.Debugf("============stockList := %s", utils.Format4Output(stockList, false)) + globals.SugarLogger.Debugf("============onlineList := %s", utils.Format4Output(onlineList, false)) + globals.SugarLogger.Debugf("============offlineList := %s", utils.Format4Output(offlineList, false)) + globals.SugarLogger.Debugf("============priceList := %s", utils.Format4Output(priceList, false)) + task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 47a4c8f74..cb5136be8 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -793,6 +793,7 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve // 这个函数之前是要设置没有删除或同步标志不为0的,会导致将同步标志不为0且删除了的把标志去掉,现在改为只设置没有删除的 func SetStoreSkuSyncStatus(db *DaoDB, vendorID int, storeIDs []int, skuIDs []int, syncStatus int) (num int64, err error) { + globals.SugarLogger.Debugf("============3") isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` diff --git a/business/partner/purchase/tiktok_store/order_afs_utils.go b/business/partner/purchase/tiktok_store/order_afs_utils.go index 1e8a3406d..53f2718ab 100644 --- a/business/partner/purchase/tiktok_store/order_afs_utils.go +++ b/business/partner/purchase/tiktok_store/order_afs_utils.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" - "git.rosy.net.cn/jx-callback/globals" "strings" ) @@ -117,10 +116,8 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * } if msgId == tiktokShop.CallbackUpdateRefundOrderMsgTagId { _, err = dao.DeleteEntity(dao.GetDB(), afsOrder, "VendorOrderID", "VendorID") - globals.SugarLogger.Debugf("err1============== %v", err) afsOrder.Skus[0].VendorOrderID = afsOrder.VendorOrderID _, err = dao.DeleteEntity(dao.GetDB(), afsOrder.Skus[0], "VendorOrderID") - globals.SugarLogger.Debugf("err2============== %v", err) } err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 35736f283..1683b5d9b 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -152,7 +152,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI param.Pic = img // 商品详情图 if storeSku.DescImg == "" { - param.Description = img + param.Description = strings.Split(img, ",")[0] } else { img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg) if err != nil { @@ -307,11 +307,15 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } param.Pic = img // 商品详情图 - img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg) - if err != nil { - return nil, err + if storeSku.DescImg == "" { + param.Description = strings.Split(img, ",")[0] + } else { + img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg) + if err != nil { + return nil, err + } + param.Description = img2 } - param.Description = img2 // weight_unit 目前抖音只支持g和kg两种 switch storeSku.Unit { @@ -321,16 +325,41 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI param.WeightUnit = tiktokShop.WeightUint_G } - // spec_prices - param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, utils.Str2Int64(storeSku.VendorSkuID), storeSku) - param.ProductFormatNew = storeSku.TiktokAttribute + param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) + // 获取商品的属性 + if storeSku.TiktokAttribute == "" || storeSku.TiktokAttribute == "{}" { + categoryList, err := api.GetCatePropertyV2(param.CategoryLeafId) + if err != nil { + return nil, err + } + categoryMap := make(map[string][]map[string]interface{}) + for _, v := range categoryList.Data.Data { + if v.Required == model.YES { + options := make([]map[string]interface{}, 0) + if v.PropertyName == "品牌" { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 789194134, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } else if v.PropertyName == "产地" { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 13850, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } else if len(options) == 0 { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 0, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } else { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": v.Options[0].Value, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } + } + continue + } + param.ProductFormatNew = utils.Format4Output(categoryMap, false) + dao.UpdateSkuNameTiktokAttr(dao.GetDB(), int64(storeSku.NameID), param.ProductFormatNew) + } else { + param.ProductFormatNew = storeSku.TiktokAttribute + } // 获取品牌 - //brandID, err := api.GetSkuBrand(param.CategoryLeafId) - //if err != nil { - // return nil, err - //} - //param.StandardBrandId = brandID + param.StandardBrandId = 789194134 // 默认品牌京西菜市 //tiktokResult, err := api.EditStoreCommodity(param) // 创建主商品 //if err != nil { @@ -356,7 +385,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } - storeSku.VendorSkuID = storeSku.VendorSkuID + } return } diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 6444747fe..9280a9b72 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -3,6 +3,7 @@ package controllers import ( "fmt" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/globals" "github.com/panjf2000/ants" "io" "sync" @@ -38,6 +39,7 @@ func (c *SyncController) SyncStoresSkus() { if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.SkuIDs, &skuIDs, params.VendorIDs, &vendorIDs); err != nil { return retVal, "", err } + globals.SugarLogger.Debugf("============1") retVal, err = cms.CurVendorSync.SyncStoresSkus(params.Ctx, nil, 0, db, vendorIDs, storeIDs, skuIDs, params.IsForce, params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) From af6533fd9b4a49978d2049ed730ea5e0052bb737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 9 Nov 2022 14:36:02 +0800 Subject: [PATCH 3/3] 1 --- business/jxstore/cms/sync_store_sku.go | 6 +++ business/model/dao/store_sku.go | 9 +++-- business/model/store_sku.go | 3 +- business/partner/partner_store_sku.go | 5 ++- .../purchase/tiktok_store/store_sku2.go | 39 +++++++------------ .../purchase/tiktok_store/store_sku2_utils.go | 5 +++ 6 files changed, 35 insertions(+), 32 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index afa4d4c55..2a06c820b 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -279,6 +279,9 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk if inSku.VendorSkuAttrId != "" { outSku.VendorSkuAttrId = inSku.VendorSkuAttrId } + if inSku.VendorSonSkuID != "" { + outSku.VendorSonSkuID = inSku.VendorSonSkuID + } return outSku } @@ -379,6 +382,9 @@ func sku2Update(vendorID int, sku *dao.StoreSkuSyncInfo, syncStatus int8) (item if sku.VendorSkuAttrId != "" { kvs["VendorSkuAttrId"] = sku.VendorSkuAttrId } + if sku.VendorSonSkuID != "" { + kvs["VendorSonSkuID"] = sku.VendorSonSkuID + } storeSku := &model.StoreSkuBind{} storeSku.ID = sku.BindID item = &dao.KVUpdateItem{ diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index cb5136be8..9edc32907 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -75,9 +75,10 @@ type StoreSkuSyncInfo struct { // 平台相关的store sku信息 StoreSkuStatus int // 库存状态 SkuSyncStatus int8 // 锁定状态 - VendorSkuID string `orm:"column(vendor_sku_id)"` - VendorSkuAttrId string `orm:"column(vendor_sku_attr_id)"` - VendorMainId string `orm:"column(vendor_main_id)"` + VendorSkuID string `orm:"column(vendor_sku_id)"` // 子商品id + VendorSonSkuID string `orm:"column(vendor_son_sku_id)"` // 子商品skuid + VendorSkuAttrId string `orm:"column(vendor_sku_attr_id)"` // 主商品skuid + VendorMainId string `orm:"column(vendor_main_id)"` // 主商品id JdsWareID int64 `orm:"column(jds_ware_id)" json:"jdsWareID"` BindDeletedAt time.Time `orm:"type(datetime)" json:"bindDeletedAt"` @@ -566,7 +567,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo SELECT t14.vendor_id, t14.vendor_org_code, t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status, - %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,t1.vendor_sku_attr_id,t1.vendor_main_id, + %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,t1.vendor_son_sku_id,t1.vendor_sku_attr_id,t1.vendor_main_id, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock, t1.mt_ladder_box_price, t2.*, t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,t3.tiktok_attribute, diff --git a/business/model/store_sku.go b/business/model/store_sku.go index 210462ab1..7e84ef0e8 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -115,13 +115,14 @@ type StoreSkuBind struct { // ElmID int64 `orm:"column(elm_id);index"` MtwmID int64 `orm:"column(mtwm_id);index"` EbaiID int64 `orm:"column(ebai_id);index"` - DdID int64 `orm:"column(dd_id);index"` // 子品主商品id YbID int64 `orm:"column(yb_id);index"` JdsID int64 `orm:"column(jds_id);index"` JdsWareID int64 `orm:"column(jds_ware_id)"` //GmID string `orm:"column(gm_id)"` // WscID int64 `orm:"column(wsc_id);index"` // 表示微盟skuId // WscID2 int64 `orm:"column(wsc_id2);index"` // 表示微盟goodsId + DdID int64 `orm:"column(dd_id);index"` // 子品主商品id + VendorSonSkuID string `orm:"column(vendor_son_sku_id)"` // 子商品skuid VendorSkuAttrId string `orm:"column(vendor_sku_attr_id)"` // 抖音需要,主品skuid VendorMainId string `orm:"column(vendor_Main_id)"` // 抖音需要,商品主id diff --git a/business/partner/partner_store_sku.go b/business/partner/partner_store_sku.go index bf12c3a6b..8b212223a 100644 --- a/business/partner/partner_store_sku.go +++ b/business/partner/partner_store_sku.go @@ -56,8 +56,9 @@ type StoreSkuInfo struct { SpecUnit string `json:"specUnit"` SpecQuality float32 `json:"specQuality"` - VendorMainId string `json:"vendorMainId"` - VendorSkuAttrId string `json:"vendorSkuAttrId"` + VendorMainId string `json:"vendorMainId"` // 主商品id + VendorSkuAttrId string `json:"vendorSkuAttrId"` //主商品sku_id + VendorSonSkuID string `json:"vendorSonSkuID"` // 子商品skuid } type StoreSkuInfoWithErr struct { diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index 5d2d351df..82b009442 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -281,33 +281,22 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { api := getAPI(vendorOrgCode, storeID, vendorStoreID) for _, v := range storeSkuList { - //param := &product_editV2_request.ProductEditV2Param{} - //param.ProductId = utils.Str2Int64(v.VendorSkuID) - //param.Specs = "净重|" + fmt.Sprintf("%f", v.SpecQuality) + v.SpecUnit - // - //skuSize := make([]*tiktokShop.SpecDetailList, 0, 0) - //detail1 := strings.Split(param.Specs, "^") - //name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",") - //for i := 0; i < len(name1); i++ { - // sku := &tiktokShop.SpecDetailList{ - // SpecDetailName1: name1[i], - // StockNum: v.Stock, - // Price: int(v.VendorPrice), - // Code: utils.Int2Str(v.SkuID), - // StepStockNum: 0, - // SupplierID: "", - // OuterSkuID: utils.Int2Str(v.NameID), - // DeliveryInfos: []*tiktokShop.DeliveryInfos{ - // {InfoType: "weight", InfoUnit: v.SpecUnit, InfoValue: fmt.Sprintf("%f", v.SpecQuality)}, - // }, - // } - // skuSize = append(skuSize, sku) - //} - //data, _ := json.Marshal(skuSize) - //param.SpecPrices = string(data) - err := api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ + // 更新主品 + err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ Price: v.VendorPrice, SkuId: utils.Str2Int64(v.VendorSkuAttrId), + ProductId: utils.Str2Int64(v.VendorMainId), + }) + if err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "更新主品价格异常")...) + } else { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "更新主品价格正常")...) + } + + // 更新子品 + err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ + Price: v.VendorPrice, + SkuId: utils.Str2Int64(v.VendorSonSkuID), ProductId: utils.Str2Int64(v.VendorSkuID), }) if err != nil { diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 1683b5d9b..f9bbacaa4 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -275,6 +275,11 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } + var attrId2 []string + for _, v := range tiktokResultChildren.Sku { + attrId2 = append(attrId2, utils.Int64ToStr(v.SkuId)) + } + storeSku.VendorSonSkuID = strings.Join(attrId2, ",") // 属性id skuID storeSku.VendorSkuID = utils.Int64ToStr(tiktokResultChildren.ProductId) // 子商品主id storeSku.VendorMainId = utils.Int64ToStr(tiktokResultProductId) // 商品主id }