From 1d3f68c1035c12d1d5266aa9befe84247c4de361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 14 Dec 2022 16:35:38 +0800 Subject: [PATCH] 1 --- business/model/model.go | 6 +- .../purchase/tiktok_store/store_sku2.go | 166 +++++------------- .../purchase/tiktok_store/store_sku2_utils.go | 113 ++++++------ 3 files changed, 104 insertions(+), 181 deletions(-) diff --git a/business/model/model.go b/business/model/model.go index f4fe2c241..bd40a0331 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -93,9 +93,9 @@ const ( SyncFlagSeqMask = 64 // 门店商家分类下的排序顺序 // combine - SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask | SyncFlagStockMask - SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask - SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask + SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask | SyncFlagStockMask // 同步标志存储仅Sku掩码 + SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask // 同步标志存储Sku修改掩码 + SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask // 同步标志已更改掩码 ) func IsSyncStatusNew(syncStatus int8) bool { diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index dc1c3216b..6dbbbf3c7 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -1,7 +1,6 @@ package tiktok_store import ( - "errors" "fmt" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" product_listV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/request" @@ -76,62 +75,6 @@ func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) { } func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { - //level := 1 - //if storeCat.ParentCatName != "" { - // level = 2 - //} - //originName := "" - //catName := storeCat.Name - //catCode := storeCat.ID - // - //subCatName := "" - //subCatCode := 0 - //if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 { - // // 修改一级分类 - // originName = storeCat.VendorCatID - //} - //if level == 2 { // 二级分类 - // // 创建二级分类 - // originName = storeCat.ParentVendorCatID - // catName = storeCat.ParentCatName - // catCode = storeCat.ParentID - // subCatName = storeCat.Name - // subCatCode = storeCat.ID - // if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 { - // // 修改二级分类 - // originName = storeCat.VendorCatID - // catName = storeCat.Name - // catCode = storeCat.ID - // subCatName = "" - // subCatCode = 0 - // } - //} - //if catName == "" { - // panic("catName is empty") - //} - //catName = utils.FilterEmoji(catName) - //subCatName = utils.FilterEmoji(subCatName) - // vendorStoreID, originName, catCode, catName, subCatCode, subCatName, storeCat.Seq) - //if globals.EnableMtwmStoreWrite { - // // err = api.MtwmAPI.RetailCatUpdate2(vendorStoreID, tryCatName2Code(originName), originName, catCode2Str(catCode), catName, catCode2Str(subCatCode), subCatName, storeCat.Seq) - // param4Update := &mtwmapi.Param4UpdateCat{ - // CategoryCodeOrigin: tryCatName2Code(originName), - // CategoryNameOrigin: originName, - // CategoryCode: catCode2Str(catCode), - // SecondaryCategoryCode: catCode2Str(subCatCode), - // SecondaryCategoryName: subCatName, - // Sequence: storeCat.Seq, - // } - // err = getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID).RetailCatUpdate(vendorStoreID, catName, param4Update) - // if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && originName != "" { // 修改分类名,但分类不存在 - // storeCat.CatSyncStatus |= model.SyncFlagNewMask - // err = p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat) - // } - //} - //if err == nil { - // // storeCat.VendorCatID = utils.FilterEmoji(storeCat.Name) - // storeCat.VendorCatID = utils.Int2Str(storeCat.ID) - //} return err } @@ -140,23 +83,6 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in } func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) { - //if false { - // if globals.EnableMtwmStoreWrite { - // err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID) - // } - //} else { - // var catCodes []string - // if catCode := tryCatName2Code(vendorCatID); catCode != "" { - // catCodes = []string{catCode} - // } - // if globals.EnableMtwmStoreWrite { - // if level == 1 { - // err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil) - // } else { - // err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil) - // } - // } - //} return err } @@ -181,22 +107,12 @@ func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) { // } func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, false) - // if err == nil && vendorStoreID == specialStoreID { - // for i := 0; i < 2; i++ { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true) - // } - // } return failedList, err } // CreateStoreSkus 门店创建商品 func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, true) - //if err == nil && vendorStoreID == specialStoreID { - // for i := 0; i < 2; i++ { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true) - // } - //} return failedList, err } @@ -207,7 +123,7 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v continue } if err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).DeleteStoreCommodity(utils.Str2Int64(v.VendorSkuID)); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除主商品")...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除子商品")...) } dao.DeleteThingToTiktokMapList(model.VendorIDDD, v.VendorMainId) } @@ -224,16 +140,16 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr if status == model.SkuStatusNormal { // 下架 for _, v := range storeSkuList { // 子品商品id获取skuId - childrenSku, err := api.GetSkuDetail(v.VendorSkuID, "") - if err != nil { - return nil, err - } - if len(childrenSku.SpecPrices) <= 0 { - return nil, errors.New("子品商品详情获取失败") - } + //childrenSku, err := api.GetSkuDetail(v.VendorSkuID, "") + //if err != nil { + // return nil, err + //} + //if len(childrenSku.SpecPrices) <= 0 { + // return nil, errors.New("子品商品详情获取失败") + //} param := &sku_syncStock_request.SkuSyncStockParam{ - SkuId: childrenSku.SpecPrices[0].SkuId, + //SkuId: childrenSku.SpecPrices[0].SkuId, ProductId: utils.Str2Int64(v.VendorSkuID), Incremental: false, IdempotentId: "", @@ -241,23 +157,22 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr OutWarehouseId: vendorStoreID, } if err := api.UpdateSkuStock(param); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) - } else { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架商品,库存值最大化.%s", utils.Format4Output(param, false)))...) } + } } else { // 上架 for _, v := range storeSkuList { // 子品商品id获取skuId - childrenSku, err := api.GetSkuDetail(v.VendorSkuID, "") - if err != nil { - return nil, err - } - if len(childrenSku.SpecPrices) <= 0 { - return nil, errors.New("子品商品详情获取失败") - } + //childrenSku, err := api.GetSkuDetail(v.VendorSkuID, "") + //if err != nil { + // return nil, err + //} + //if len(childrenSku.SpecPrices) <= 0 { + // return nil, errors.New("子品商品详情获取失败") + //} param := &sku_syncStock_request.SkuSyncStockParam{ - SkuId: childrenSku.SpecPrices[0].SkuId, + //SkuId: childrenSku.SpecPrices[0].SkuId, ProductId: utils.Str2Int64(v.VendorSkuID), Incremental: false, IdempotentId: "", @@ -265,9 +180,7 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr OutWarehouseId: vendorStoreID, } if err := api.UpdateSkuStock(param); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) - } else { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架商品正常,添加固定库存.%s", utils.Format4Output(param, false)))...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架商品,库存值为0失败.%s", utils.Format4Output(param, false)))...) } } } @@ -282,20 +195,20 @@ 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 { - // 更新主品 (暂不支持渠道主商品) + // 更新子品价格 err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ - Price: v.VendorPrice, - SkuId: utils.Str2Int64(v.VendorSkuAttrId), - ProductId: utils.Str2Int64(v.VendorMainId), + Price: v.VendorPrice, + //SkuId: utils.Str2Int64(v.VendorSkuAttrId), + ProductId: utils.Str2Int64(v.VendorSkuID), }) if err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "更新主品价格异常")...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "同步子品价格异常")...) } // 更新子品 - if _, err := api.BatchApplyStoreProductPrice(utils.Str2Int64(v.VendorMainId)); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "同步子品价格异常")...) - } + //if _, err := api.BatchApplyStoreProductPrice(utils.Str2Int64(v.VendorMainId)); err != nil { + // 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), @@ -308,9 +221,9 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg //} } - if len(failedList) > 0 { - err = nil - } + //if len(failedList) > 0 { + // err = nil + //} return failedList, err } @@ -318,22 +231,25 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { tiktokApi := getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID) for _, v := range storeSkuList { - err := tiktokApi.UpdateSkuStock(&sku_syncStock_request.SkuSyncStockParam{ - SkuId: utils.Str2Int64(v.VendorSkuAttrId), + stockNum := &sku_syncStock_request.SkuSyncStockParam{ + //SkuId: utils.Str2Int64(v.VendorSkuAttrId), ProductId: utils.Str2Int64(v.VendorSkuID), Incremental: false, IdempotentId: "", StockNum: int64(v.Stock), OutWarehouseId: vendorStoreID, - }) - if err != nil { + } + if stockNum.StockNum == 0 { + stockNum.StockNum = 99999 + } + + if err := tiktokApi.UpdateSkuStock(stockNum); 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], "更新库存正常")...) } } - return p.UpdateStoreSkusPrice(ctx, vendorOrgCode, storeID, vendorStoreID, storeSkuList) + return failedList, err + //return p.UpdateStoreSkusPrice(ctx, vendorOrgCode, storeID, vendorStoreID, storeSkuList) } func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) { diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index c1d299283..349ddbd1e 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -14,7 +14,8 @@ import ( product_listV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/response" 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" - superm_product_batchRedistributeStoreProduct_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/superm_product_batchRedistributeStoreProduct/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" 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" @@ -178,7 +179,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI // param.CategoryLeafId = storeSku.VendorVendorCatID //} if param.CategoryLeafId == 0 { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, errors.New("当前商品本地未设置抖音分类/抖音推荐分类查询错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("当前商品本地未设置抖音分类/抖音推荐分类查询错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } // 是否支持七天无理由 @@ -201,14 +202,14 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.ProductFormatNew, err = MakeProductFormatNew(api, int64(storeSku.NameID), param.CategoryLeafId) if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } } param.StandardBrandId = 789194134 // 默认品牌京西菜市 596120136 param.FreightId, param.SaleLimitId, err = getFreightIdAndSaleLimitId(api, db, storeDetail, vendorStoreID) if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } @@ -223,18 +224,19 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI globals.SugarLogger.Debugf("========result %s", utils.Format4Output(tiktokResult, false)) globals.SugarLogger.Debugf("========err %s", utils.Format4Output(err, false)) if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } if err := dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, "本地不存在,线上也不存在", model.ThingTypeSku, model.SyncFlagNewMask); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) } var attrId []string for _, v := range tiktokResult.Sku { attrId = append(attrId, utils.Int64ToStr(v.SkuId)) } + storeSku.SkuSyncStatus = model.SyncFlagNewMask storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId) storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品 @@ -243,43 +245,51 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI // 本地不存在,线上存在.直接创建子商品保存本地同步记录 var childrenProductId int64 = 0 if mainOrderDetail.CheckStatus != tiktokShop.SkuCheckStatusPass && mainOrderDetail.CheckStatus != tiktokShop.SkuCheckStatusPassNotPutOn { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, fmt.Errorf("主商品审核中或审核失败:[%d]", storeSku.SkuID), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, fmt.Errorf("主商品审核中或审核失败:[%d]", storeSku.SkuID), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } childrenProductId, err = api.CreateSubProduct(mainOrderDetail.MainProductId, utils.Str2Int64(vendorStoreID)) if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - if storeSku.VendorSkuID == "" { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - } + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) } if err := dao.CreateThingMap(int64(storeSku.SkuID), mainOrderDetail.ProductIdStr, storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId, model.ThingTypeSku, 0); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - if storeSku.VendorSkuID == "" { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - } + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) } + storeSku.VendorMainId = mainOrderDetail.ProductIdStr var attrId []string for _, v := range mainOrderDetail.SpecPrices { attrId = append(attrId, utils.Int64ToStr(v.SkuId)) } - storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID - storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) - storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID + if childrenProductId > 0 { + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.SkuSyncStatus = 0 + failedList = upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType) + } else { + storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) // 子商品主id + storeSku.SkuSyncStatus = model.SyncFlagNewMask + } } } else { globals.SugarLogger.Debugf("========result %s", "本地存在,直接创建子商品") // 主商品存在,直接同步子商品 childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID)) - if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - if storeSku.VendorSkuID == "" { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - } + if err != nil || childrenProductId == 0 { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + storeSku.SkuSyncStatus = model.SyncFlagNewMask + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id continue } + + // 同步价格,库存,上架 + failedList = upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType) + storeSku.SkuSyncStatus = 0 storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id @@ -355,34 +365,6 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } - - // 门店商品同步,先删除同步商品,在重新分配该商品 - if _, err := api.BatchRedistributeStoreProduct(&superm_product_batchRedistributeStoreProduct_request.TaskParams{ - MainProductId: param.MainProductId, - AddStoreIds: nil, - DelStoreIds: []int64{param.StoreId}, - }); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - continue - } - - // 主商品修改之后需要审核,审核通过之后在分配 - if _, err := api.BatchRedistributeStoreProduct(&superm_product_batchRedistributeStoreProduct_request.TaskParams{ - MainProductId: param.MainProductId, - AddStoreIds: []int64{param.StoreId}, - DelStoreIds: nil, - }); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - if err := dao.CreateThingMap(int64(storeSku.SkuID), storeSku.VendorMainId, storeDetail.VendorOrgCode+"|"+vendorStoreID, storeSku.VendorSkuAttrId, model.ThingTypeSku, model.SyncFlagNewMask); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - if storeSku.VendorSkuID == "" { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - } - } - } - } return } @@ -393,8 +375,33 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI return failedList, err } -func createChildrenProduct() { - +func upDateChildrenPriceStockLaunch(api *tiktokShop.API, storeSku *dao.StoreSkuSyncInfo, childrenProductId int64, vendorStoreID, syncType string) (failedList []*partner.StoreSkuInfoWithErr) { + // 同步价格 + if err := api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ + Price: storeSku.VendorPrice, + ProductId: childrenProductId, + }); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], syncType) + } + // 同步库存 + paramStock := &sku_syncStock_request.SkuSyncStockParam{ + ProductId: childrenProductId, + Incremental: false, + IdempotentId: "", + StockNum: int64(storeSku.Stock), + OutWarehouseId: vendorStoreID, + } + if paramStock.StockNum == 0 { + paramStock.StockNum = 99999 + } + if err := api.UpdateSkuStock(paramStock); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("子商品添加固定库存.%s", err.Error()))...) + } + // 上架 + if err := api.LaunchProduct(childrenProductId); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架子商品异常.%s", err.Error()))...) + } + return failedList } func getFreightIdAndSaleLimitId(api *tiktokShop.API, db *dao.DaoDB, storeDetail *dao.StoreDetail, vendorStoreID string) (freightId, saleLimitId int64, err error) {