Files
jx-callback/business/partner/purchase/ebai/store_sku2.go
2019-07-13 10:37:08 +08:00

342 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 = 1
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(vendorStoreID, 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(vendorStoreID, 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.Price)
}
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": storeSku.Name,
"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.Price
params["market_price"] = storeSku.Price
}
if storeSku.StoreSkuSyncStatus&(model.SyncFlagSaleMask|model.SyncFlagNewMask) != 0 {
params["status"] = jxSkuStatus2Ebai(storeSku.StoreSkuStatus)
}
// todo 饿百如果给的UPC是空要报错但如果我要删除UPC怎么弄
if storeSku.Upc != "" {
params["upc"] = storeSku.Upc
}
return params
}
func (p *PurchaseHandler) GetStoreSkusBareInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inStoreSkuList []*partner.StoreSkuInfo) (outStoreSkuList []*partner.StoreSkuInfo, err error) {
vendorSkuIDIntList := partner.BareStoreSkuInfoList(inStoreSkuList).GetVendorSkuIDIntList()
var vendorSkuList []*ebaiapi.SkuInfo
if len(vendorSkuIDIntList) > 1 {
task := tasksch.NewParallelTask("获取饿百平台门店商品信息", nil, ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorSkuID := batchItemList[0].(int64)
skuInfo, err := api.EbaiAPI.SkuList(utils.Int2Str(storeID), &ebaiapi.SkuListParams{
SkuID: vendorSkuID,
})
if err == nil {
vendorSkuList = skuInfo.List
return skuInfo.List, nil
}
return nil, err
}, vendorSkuIDIntList)
tasksch.HandleTask(task, parentTask, false).Run()
_, err = task.GetResult(0)
} else if len(vendorSkuIDIntList) == 1 {
skuInfo, err2 := api.EbaiAPI.SkuList(utils.Int2Str(storeID), &ebaiapi.SkuListParams{
SkuID: vendorSkuIDIntList[0],
})
if err = err2; err == nil {
vendorSkuList = skuInfo.List
}
} else {
return nil, nil
}
if err == nil {
storeSkuMap := make(map[int64]*partner.StoreSkuInfo)
for _, v := range inStoreSkuList {
storeSkuMap[utils.Str2Int64(v.VendorSkuID)] = v
}
for _, vendorSku := range vendorSkuList {
storeSku := storeSkuMap[vendorSku.SkuID]
// globals.SugarLogger.Debug(utils.Format4Output(storeSku, false))
storeSku.Stock = vendorSku.LeftNum
storeSku.Price = vendorSku.SalePrice
storeSku.Status = ebaiSkuStatus2Jx(vendorSku.Status)
outStoreSkuList = append(outStoreSkuList, storeSku)
}
}
return outStoreSkuList, err
}
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, skuIDs []int) (skuNameList []*partner.SkuNameInfo, err error) {
params := &ebaiapi.SkuListParams{
PageSize: MaxPageSize,
}
if len(skuIDs) == 1 {
params.CustomSkuID = utils.Int2Str(skuIDs[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)
}
skuName = &partner.SkuNameInfo{
Prefix: prefix,
Name: name,
Unit: unit,
SkuList: []*partner.SkuInfo{
&partner.SkuInfo{
StoreSkuInfo: partner.StoreSkuInfo{
VendorSkuID: utils.Int64ToStr(vendorSku.SkuID),
SkuID: int(utils.Str2Int64WithDefault(vendorSku.CustomSkuID, 0)),
Stock: vendorSku.LeftNum,
Price: 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
}