From 5b512fcada845764c95da372afa1a4bba2b259be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 30 Jul 2025 10:22:54 +0800 Subject: [PATCH] 1 --- business/jxstore/cms/system_store_sku.go | 2 +- .../purchase/tiktok_store/store_sku2.go | 6 + .../purchase/tiktok_store/store_sku2_utils.go | 229 ++++++++++-------- controllers/jx_order.go | 2 +- 4 files changed, 133 insertions(+), 106 deletions(-) diff --git a/business/jxstore/cms/system_store_sku.go b/business/jxstore/cms/system_store_sku.go index 6046c40ad..a831ba845 100644 --- a/business/jxstore/cms/system_store_sku.go +++ b/business/jxstore/cms/system_store_sku.go @@ -792,7 +792,7 @@ func BatchInitSkuMT2TT(ctx *jxcontext.Context, fromSku []*mtwmapi.AppFood, fromS dao.CreateEntity(db, copyData) } else { // 主商品存在,直接同步子商品 - childrenProductId, err := toApi.CreateSubProduct(utils.Str2Int64(copyMap[storeSku.AppPoiCode].MainSkuId), utils.Str2Int64(toStoreDetail.VendorStoreID)) + childrenProductId, _, err := toApi.CreateSubProduct(utils.Str2Int64(copyMap[storeSku.AppPoiCode].MainSkuId), utils.Str2Int64(toStoreDetail.VendorStoreID)) // 2010004:主商品非在线审核通过状态,不允许绑定子商品 if err != nil && strings.Contains(err.Error(), "2010004") { // 线上本地都存在,但是线上审核不成功,就去更新主商品 diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index a61e6059f..34733562d 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -98,12 +98,18 @@ 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 storeID == 669044 { + globals.SugarLogger.Debugf("------storeSkuList- UpdateStoreSkus := %s", utils.Format4Output(storeSkuList, false)) + } 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 storeID == 669044 { + globals.SugarLogger.Debugf("------storeSkuList- UpdateStoreSkus := %s", utils.Format4Output(storeSkuList, false)) + } return failedList, err } diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 0c19282ab..1d63c8635 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" product_addV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_addV2/response" + "git.rosy.net.cn/jx-callback/globals" beego "github.com/astaxie/beego/server/web" "strings" "time" @@ -130,6 +131,10 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI db := dao.GetDB() storeDetail, _ := dao.GetStoreDetail(db, storeID, model.VendorIDDD, "") api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID) + if storeID == 669044 { + globals.SugarLogger.Debugf("-----storeSkuList %s", utils.Format4Output(storeSkuList, false)) + globals.SugarLogger.Debugf("-----isCreate %s", utils.Format4Output(isCreate, false)) + } if isCreate { syncType = "创建商品" for _, storeSku := range storeSkuList { // 创建商品 @@ -214,120 +219,131 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品 failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - } else if localThing[0].SyncStatus == model.ThingTypeSyncFail { // 同步失败在重新创建 - param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType) - if len(failedList2) != 0 { - failedList = append(failedList, failedList2...) - continue - } - tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品,同步主商品 - if err != nil { - storeSku.SkuSyncStatus = 0 // 只创建主品,子品都没做 - storeSku.VendorSonSkuID = err.Error() - dao.UpdateThingMap(db, model.ThingTypeSyncingStop, err.Error(), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode) - failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - continue - } + } else { + switch localThing[0].SyncStatus { + case model.ThingTypeSyncFail: // 同步失败在重新创建 + param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType) + if len(failedList2) != 0 { + failedList = append(failedList, failedList2...) + continue + } + tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品,同步主商品 + if err != nil { + storeSku.SkuSyncStatus = 0 // 只创建主品,子品都没做 + storeSku.VendorSonSkuID = err.Error() + dao.UpdateThingMap(db, model.ThingTypeSyncingStop, err.Error(), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue + } - if err := dao.UpdateThingMap(db, model.ThingTypeSyncSuccess, utils.Int64ToStr(tiktokResult.ProductId), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode); err != nil { + if err := dao.UpdateThingMap(db, model.ThingTypeSyncSuccess, utils.Int64ToStr(tiktokResult.ProductId), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode); err != nil { + storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue + } + var attrId []string + for _, v := range tiktokResult.Sku { + attrId = append(attrId, utils.Int64ToStr(v.SkuId)) + } + mainProductId = tiktokResult.ProductId + //storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 - failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId) + storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID + //storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品 + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + case model.ThingTypeSyncing: + if time.Now().Unix()-localThing[0].CreatedAt.Unix() > 300 { + dao.DeleteThingToTiktokMapList(model.VendorIDDD, localThing[0].VendorThingID, storeSku.SkuID) + } + storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("商品同步中或同步错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue - } - var attrId []string - for _, v := range tiktokResult.Sku { - attrId = append(attrId, utils.Int64ToStr(v.SkuId)) - } - mainProductId = tiktokResult.ProductId - //storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 - storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId) - storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID - //storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品 - failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - } else if localThing[0].SyncStatus == model.ThingTypeSyncing { - if time.Now().Unix()-localThing[0].CreatedAt.Unix() > 300 { - dao.DeleteThingToTiktokMapList(model.VendorIDDD, localThing[0].VendorThingID, storeSku.SkuID) - } - storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 - failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("商品同步中或同步错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - continue - } else if localThing[0].SyncStatus == model.ThingTypeSyncSuccess { - // 主商品存在,直接同步子商品 - childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID)) - if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品 - // 线上本地都存在,但是线上审核不成功,就去更新主商品 - mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID) - if mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusProhibit || mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusNotPass { - // 更新主商品,在同步到子门店,考虑审核时间 - param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType) - if len(failedList2) != 0 { - failedList = append(failedList, failedList2...) + case model.ThingTypeSyncSuccess: + // 主商品存在,直接同步子商品 + childrenProductId, sonSkuId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID)) + if storeID == 669044 { + globals.SugarLogger.Debugf("---childrenProductId- :%d", childrenProductId) + globals.SugarLogger.Debugf("---childrenProductId- :%s", sonSkuId) + } + if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品 + // 线上本地都存在,但是线上审核不成功,就去更新主商品 + mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID) + if mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusProhibit || mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusNotPass { + // 更新主商品,在同步到子门店,考虑审核时间 + param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType) + if len(failedList2) != 0 { + failedList = append(failedList, failedList2...) + continue + } + updateParam := &product_editV2_request.ProductEditV2Param{ + PayType: tiktokShop.TiktokPayType1, + ReduceType: tiktokShop.SkuReduceTypePayMakeOrder, + Weight: utils.Int2Float64(storeSku.Weight), + DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay, + PresellType: tiktokShop.SendGoodsTypeNow, + Mobile: storeDetail.Tel1, + Commit: true, + Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, + NeedRechargeMode: false, + SellChannel: []int64{0}, + StartSaleType: 0, + PickupMethod: "0", + CategoryLeafId: param.CategoryLeafId, + Name: param.Name, + ProductFormatNew: param.ProductFormatNew, + } + // 是否支持七天无理由 + isAfterSale, rule := api.GetProductUpdateRule(param.CategoryLeafId) + if isAfterSale { + param.AfterSaleService = map[string]string{"supply_day_return_selector": fmt.Sprintf("%s", rule)} + } + updateParam.Pic = param.Pic + updateParam.Description = param.Description + updateParam.WeightUnit = tiktokShop.WeightUint_G + + updateParam.ProductId = mainOrderDetail.ProductId + updateParam.MainProductId = mainProductId + updateParam.SpecPrices = param.SpecPrices + updateParam.StandardBrandId = param.StandardBrandId + if err2 := api.EditStoreCommodity(updateParam); err2 != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err2, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } + storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("修改主品,主品审核中/失败,子商品未创建"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } - updateParam := &product_editV2_request.ProductEditV2Param{ - PayType: tiktokShop.TiktokPayType1, - ReduceType: tiktokShop.SkuReduceTypePayMakeOrder, - Weight: utils.Int2Float64(storeSku.Weight), - DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay, - PresellType: tiktokShop.SendGoodsTypeNow, - Mobile: storeDetail.Tel1, - Commit: true, - Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, - NeedRechargeMode: false, - SellChannel: []int64{0}, - StartSaleType: 0, - PickupMethod: "0", - CategoryLeafId: param.CategoryLeafId, - Name: param.Name, - ProductFormatNew: param.ProductFormatNew, - } - // 是否支持七天无理由 - isAfterSale, rule := api.GetProductUpdateRule(param.CategoryLeafId) - if isAfterSale { - param.AfterSaleService = map[string]string{"supply_day_return_selector": fmt.Sprintf("%s", rule)} - } - updateParam.Pic = param.Pic - updateParam.Description = param.Description - updateParam.WeightUnit = tiktokShop.WeightUint_G - - updateParam.ProductId = mainOrderDetail.ProductId - updateParam.MainProductId = mainProductId - updateParam.SpecPrices = param.SpecPrices - updateParam.StandardBrandId = param.StandardBrandId - if err2 := api.EditStoreCommodity(updateParam); err2 != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSku, err2, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - } - storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 - failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("修改主品,主品审核中/失败,子商品未创建"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - continue } - } + if sonSkuId != "" { + storeSku.VendorSonSkuID = sonSkuId + } + + if err != nil && strings.Contains(err.Error(), "2010001") { // 2010001:重复创建渠道商品 + storeSkuDetail, err := api.GetSkuDetailLocalID(vendorStoreID, utils.Int2Str(storeSku.SkuID)) + if err != nil { + failedList3 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("获取子品详情错误:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = append(failedList, failedList3...) + continue + } + storeSku.VendorSonSkuID = utils.Int64ToStr(storeSkuDetail.SpecPrices[0].SkuId) + childrenProductId = storeSkuDetail.ProductId + } + + if childrenProductId != model.NO { + // 同步价格,库存,上架 + skuId, failedList2 := upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType) + failedList = append(failedList, failedList2...) + storeSku.VendorSonSkuID = utils.Int64ToStr(skuId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id + } - if err != nil && strings.Contains(err.Error(), "2010001") { // 2010001:重复创建渠道商品 - storeSkuDetail, err := api.GetSkuDetailLocalID(vendorStoreID, utils.Int2Str(storeSku.SkuID)) if err != nil { - failedList3 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("获取子品详情错误:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - failedList = append(failedList, failedList3...) + failedList4 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("创建子品异常:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = append(failedList, failedList4...) continue } - childrenProductId = storeSkuDetail.ProductId - } - - if childrenProductId != model.NO { - // 同步价格,库存,上架 - skuId, failedList2 := upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType) - failedList = append(failedList, failedList2...) - storeSku.VendorSonSkuID = utils.Int64ToStr(skuId) // (属性id skuID方案一)(自商品的商品id方案二) - storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id - storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id - } - - if err != nil { - failedList4 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("创建子品异常:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - failedList = append(failedList, failedList4...) - continue } } } @@ -440,6 +456,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI //param.FreightId, _ = api.GetStoreBindTemp(utils.Str2Int64(vendorStoreID)) param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, mainIdInt, storeSku) err = api.EditStoreCommodity(param) + globals.SugarLogger.Debugf("-------2err := %v", err) if err != nil && !strings.Contains(err.Error(), "您上传的商品主图存在重复") { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) //storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) @@ -674,6 +691,10 @@ func checkNameLenght(name string) string { } func upDateChildrenPriceStockLaunch(api *tiktokShop.API, storeSku *dao.StoreSkuSyncInfo, childrenProductId int64, vendorStoreID, syncType string) (skuID int64, failedList []*partner.StoreSkuInfoWithErr) { skuId, failed := getProductSkuID(api, storeSku, syncType, childrenProductId) + if storeSku.StoreID == 669044 { + globals.SugarLogger.Debugf("-------skuid := %d", skuId) + globals.SugarLogger.Debugf("-------storeSku := %s", utils.Format4Output(storeSku, false)) + } if skuId == 0 || len(failed) > 0 { return 0, failed } diff --git a/controllers/jx_order.go b/controllers/jx_order.go index d975fcced..41fe1967a 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -552,7 +552,7 @@ func (c *OrderController) StaleIndexInfo() { } if permission.IsRoled(ctx) && len(dataList) == model.NO { - return retVal, "", fmt.Errorf("于该用户%s,暂无门店信息", ctx.GetUserName()) + return retVal, "", fmt.Errorf("该用户%s,暂无门店信息", ctx.GetUserName()) } retVal, err = orderman.FixedOrderManager.GetStoresOrderSaleInfo2(timeList[0], timeList[1], params.StoreID, brandIds, vendors, dataList, params.BrandOperator, params.OperatorNumber)