package ebai import ( "fmt" "strings" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "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" "git.rosy.net.cn/jx-callback/globals/api" ) func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { switch funcID { case partner.FuncUpdateStoreSkusStock, partner.FuncUpdateStoreSkusStatus, partner.FuncUpdateStoreSkusPrice, partner.FuncDeleteStoreSkus: batchSize = ebaiapi.MaxStoreSkuBatchSize case partner.FuncGetStoreSkusBareInfo: batchSize = partner.UnlimitedBatchSize case partner.FuncCreateStoreSkus, partner.FuncUpdateStoreSkus: batchSize = 1 case partner.FuncGetStoreSkusFullInfo: batchSize = 1 } return batchSize } // 门店分类 func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) { remoteCats, err := api.EbaiAPI.ShopCategoryGet(utils.Int2Str(storeID)) if err == nil { cats = convertVendorCatList(remoteCats) } return cats, err } func convertVendorCatList(remoteCats []*ebaiapi.CategoryInfo) (cats []*partner.BareCategoryInfo) { for _, rCat := range remoteCats { cat := &partner.BareCategoryInfo{ VendorCatID: utils.Int64ToStr(rCat.CategoryID), Name: rCat.Name, Level: rCat.Level, Seq: jxCatSeq2Ebai(rCat.Rank), Children: convertVendorCatList(rCat.Children), } cats = append(cats, cat) } return cats } func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { var vendorCatID int64 if globals.EnableEbaiStoreWrite { vendorCatID, err = api.EbaiAPI.ShopCategoryCreate(utils.Int2Str(storeID), utils.Str2Int64WithDefault(storeCat.ParentVendorCatID, 0), storeCat.Name, jxCatSeq2Ebai(storeCat.Seq)) } else { vendorCatID = jxutils.GenFakeID() } storeCat.VendorCatID = utils.Int64ToStr(vendorCatID) return err } func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { if globals.EnableEbaiStoreWrite { err = api.EbaiAPI.ShopCategoryUpdate(utils.Int2Str(storeID), utils.Str2Int64WithDefault(storeCat.VendorCatID, 0), storeCat.Name, jxCatSeq2Ebai(storeCat.Seq)) } return err } func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error) { if globals.EnableEbaiStoreWrite { err = api.EbaiAPI.ShopCategoryDelete(utils.Int2Str(storeID), utils.Str2Int64WithDefault(vendorCatID, 0)) } return err } // 门店商品 // 多门店平台不需要实现这个接口 func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (err error) { storeSku := storeSkuList[0] if globals.EnableEbaiStoreWrite { _, err = api.EbaiAPI.SkuUpdate(utils.Int2Str(storeID), utils.Str2Int64(storeSku.VendorSkuID), genSkuParamsFromStoreSkuInfo2(storeSku)) } return err } // 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义 func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (err error) { storeSku := storeSkuList[0] var vendorSkuID int64 if globals.EnableEbaiStoreWrite { vendorSkuID, err = api.EbaiAPI.SkuCreate(utils.Int2Str(storeID), storeSku.SkuID, genSkuParamsFromStoreSkuInfo2(storeSku)) } else { vendorSkuID = jxutils.GenFakeID() } storeSku.VendorSkuID = utils.Int64ToStr(vendorSkuID) return err } func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { if globals.EnableEbaiStoreWrite { err = api.EbaiAPI.SkuDelete(utils.Int2Str(storeID), strings.Join(partner.BareStoreSkuInfoList(storeSkuList).GetVendorSkuIDList(), ",")) } return err } func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { var validSkus, invalidSkus []string for _, storeSku := range storeSkuList { if storeSku.Status == model.SkuStatusNormal { validSkus = append(validSkus, storeSku.VendorSkuID) } else { invalidSkus = append(invalidSkus, storeSku.VendorSkuID) } } if globals.EnableEbaiStoreWrite { if len(invalidSkus) > 1 { err = api.EbaiAPI.SkuOffline(utils.Int2Str(storeID), strings.Join(invalidSkus, ",")) } else if len(invalidSkus) == 1 { err = api.EbaiAPI.SkuOfflineOne(utils.Int2Str(storeID), utils.Str2Int64(invalidSkus[0]), "", "") } if err == nil { if len(validSkus) > 1 { err = api.EbaiAPI.SkuOnline(utils.Int2Str(storeID), strings.Join(validSkus, ",")) } else if len(validSkus) == 1 { err = api.EbaiAPI.SkuOnlineOne(utils.Int2Str(storeID), utils.Str2Int64(validSkus[0]), "", "") } } } return err } func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { skuPriceList := make([]string, len(storeSkuList)) for k, v := range storeSkuList { skuPriceList[k] = fmt.Sprintf("%s:%d", v.VendorSkuID, v.VendorPrice) } if globals.EnableEbaiStoreWrite { if len(skuPriceList) > 1 { err = api.EbaiAPI.SkuPriceUpdateBatch(utils.Int2Str(storeID), strings.Join(skuPriceList, ";"), "", "") } else if len(skuPriceList) == 1 { err = api.EbaiAPI.SkuPriceUpdateOne(utils.Int2Str(storeID), skuPriceList[0], "", "") } } return err } func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { skuStockList := make([]string, len(storeSkuList)) for k, v := range storeSkuList { skuStockList[k] = fmt.Sprintf("%s:%d", v.VendorSkuID, v.Stock) } if globals.EnableEbaiStoreWrite { if len(skuStockList) > 1 { err = api.EbaiAPI.SkuStockUpdateBatch(utils.Int2Str(storeID), strings.Join(skuStockList, ";"), "", "") } else if len(skuStockList) == 1 { err = api.EbaiAPI.SkuStockUpdateOne(utils.Int2Str(storeID), skuStockList[0], "", "") } } return err } func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo) (params map[string]interface{}) { params = map[string]interface{}{ "name": utils.LimitMixedStringLen(storeSku.SkuName, ebaiapi.MaxSkuNameByteCount), "left_num": model.MaxStoreSkuStockQty, "category_id": utils.Str2Int64(storeSku.VendorCatID), "predict_cat": 0, // 不使用推荐类目 "cat1_id": getEbaiCat(storeSku.VendorVendorCatID3, 1), "cat2_id": getEbaiCat(storeSku.VendorVendorCatID2, 2), "cat3_id": getEbaiCat(storeSku.VendorVendorCatID, 3), "weight": storeSku.Weight, "photos": []map[string]interface{}{ map[string]interface{}{ "is_master": true, "url": storeSku.Img, }, }, } if storeSku.DescImg != "" { params["rtf"] = storeSku.DescImg } if storeSku.StoreSkuSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 { params["sale_price"] = storeSku.VendorPrice params["market_price"] = storeSku.VendorPrice } if storeSku.StoreSkuSyncStatus&(model.SyncFlagSaleMask|model.SyncFlagNewMask) != 0 { params["status"] = jxSkuStatus2Ebai(storeSku.MergedStatus) } // todo 饿百如果给的UPC是空要报错,但如果我要删除UPC怎么弄? // if storeSku.Upc != "" { // params["upc"] = storeSku.Upc // } return params } func ebaiSkuStatus2Jx(ebaiSkuStatus int) (jxSkuStatus int) { if ebaiSkuStatus == ebaiapi.SkuStatusOnline { jxSkuStatus = model.SkuStatusNormal } else if ebaiSkuStatus == ebaiapi.SkuStatusOffline { jxSkuStatus = model.SkuStatusDontSale } else if ebaiSkuStatus == ebaiapi.SkuStatusOnline { jxSkuStatus = model.SkuStatusDeleted } return jxSkuStatus } func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) { params := &ebaiapi.SkuListParams{ PageSize: MaxPageSize, } if len(storeSkuList) == 1 { if storeSkuList[0].SkuID > 0 { params.CustomSkuID = utils.Int2Str(storeSkuList[0].SkuID) } if storeSkuList[0].VendorSkuID != "" { params.SkuID = utils.Str2Int64WithDefault(storeSkuList[0].VendorSkuID, 0) } } page1, err := api.EbaiAPI.SkuList(utils.Int2Str(storeID), params) if err == nil { skuNameList = append(skuNameList, vendorSkuList2Jx(page1.List)...) if page1.Pages > 1 { pages := make([]int, page1.Pages-1) for i := 2; i <= page1.Pages; i++ { pages[i-2] = i } task := tasksch.NewParallelTask("ebai GetStoreAllSkus", nil, ctx, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { callParams := &ebaiapi.SkuListParams{ PageSize: MaxPageSize, Page: batchItemList[0].(int), } pageSku, err2 := api.EbaiAPI.SkuList(utils.Int2Str(storeID), callParams) if err2 == nil { return pageSku.List, err2 } return nil, err2 }, pages) tasksch.HandleTask(task, parentTask, true).Run() result, err2 := task.GetResult(0) if err = err2; err == nil { for _, v := range result { skuNameList = append(skuNameList, vendorSku2Jx(v.(*ebaiapi.SkuInfo))) } } } } return skuNameList, err } func vendorSku2Jx(vendorSku *ebaiapi.SkuInfo) (skuName *partner.SkuNameInfo) { prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(vendorSku.Name) weight := vendorSku.Weight if weight <= 0 { weight = jxutils.FormatSkuWeight(specQuality, specUnit) } skuID := int(utils.Str2Int64WithDefault(vendorSku.CustomSkuID, 0)) vendorSkuID := utils.Int64ToStr(vendorSku.SkuID) skuName = &partner.SkuNameInfo{ NameID: skuID, VendorNameID: vendorSkuID, Prefix: prefix, Name: name, Unit: unit, SkuList: []*partner.SkuInfo{ &partner.SkuInfo{ StoreSkuInfo: partner.StoreSkuInfo{ VendorSkuID: vendorSkuID, SkuID: skuID, Stock: vendorSku.LeftNum, VendorPrice: vendorSku.SalePrice, Status: ebaiSkuStatus2Jx(vendorSku.Status), }, SkuName: vendorSku.Name, Comment: comment, SpecQuality: float64(specQuality), SpecUnit: specUnit, Weight: weight, }, }, } for _, v := range vendorSku.Photos { skuName.PictureList = append(skuName.PictureList, v.URL) } // todo, 看起来饿百只返回了最低一级的商家分类信息 for _, v := range vendorSku.CustomCatList { skuName.VendorCatIDList = append(skuName.VendorCatIDList, v.CustomCatID) } return skuName } func vendorSkuList2Jx(vendorSkuList []*ebaiapi.SkuInfo) (skuNameList []*partner.SkuNameInfo) { for _, vendorSku := range vendorSkuList { skuNameList = append(skuNameList, vendorSku2Jx(vendorSku)) } return skuNameList }