Files
jx-callback/business/partner/purchase/ebai/store_sku.go

241 lines
9.9 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 (
"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/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
type tStoreSkuFullInfo struct {
model.StoreSkuBind
SpecQuality float32 `json:"specQuality"`
SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
Weight int `json:"weight"` // 重量/质量单位为克当相应的SkuName的SpecUnit为g或kg时必须等于SpecQuality
SkuStatus int
Prefix string `orm:"size(255)" json:"prefix"`
Name string `orm:"size(255);index" json:"name"`
Comment string `orm:"size(255)" json:"comment"`
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部全国可见如果否的话可见性由SkuPlace决定
Unit string `orm:"size(8)" json:"unit"`
Img string `orm:"size(255)" json:"img"`
PlaceStr string
CatName string `orm:"size(255)"`
EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别
CatID int `orm:"column(cat_id)"`
CatEbaiID int64 `orm:"column(cat_ebai_id)"`
CatEbaiSyncStatus int
CatLevel int
ParentCatName string `orm:"size(255)"`
ParentCatID int `orm:"column(parent_cat_id)"`
ParentCatEbaiID int64 `orm:"column(parent_cat_ebai_id)"`
ParentCatEbaiSyncStatus int
ParentCatLevel int
EbaiCat1ID string `orm:"column(ebai_cat1_id)"`
EbaiCat2ID string `orm:"column(ebai_cat2_id)"`
EbaiCat3ID string `orm:"column(ebai_cat3_id)"`
}
var (
defCatMap = map[int]string{
1: "151301831158987",
2: "15347484581335",
3: "15347484581339",
}
)
func (p *PurchaseHandler) SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isForce bool, userName string) (err error) {
for _, storeID := range storeIDs {
err = p.syncOneStoreSkus(db, storeID, skuIDs, isForce, userName)
if err != nil {
break
}
}
return err
}
func (p *PurchaseHandler) syncOneStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int, isForce bool, userName string) (err error) {
sql := `
SELECT t1.*, t2.spec_quality, t2.spec_unit, t2.weight, t2.status sku_status,
t3.prefix, t3.name, t3.comment, t3.is_global, t3.unit, t3.img,
t4.name cat_name, t4.ebai_category_id,
t4.id cat_id, t4.level cat_level, t5.ebai_id cat_ebai_id, t5.ebai_sync_status cat_ebai_sync_status,
t4p.name parent_cat_name,
t4p.id parent_cat_id, t4p.level parent_cat_level, t5p.ebai_id parent_cat_ebai_id, t5p.ebai_sync_status parent_cat_ebai_sync_status,
cat1.vendor_category_id ebai_cat1_id, cat2.vendor_category_id ebai_cat2_id, cat2.parent_id ebai_cat3_id
FROM store_sku_bind t1
JOIN sku t2 ON t1.sku_id = t2.id
JOIN sku_name t3 ON t2.name_id = t3.id
JOIN sku_category t4 ON t3.category_id = t4.id
JOIN sku_category t4p ON t4p.id = t4.parent_id
LEFT JOIN store_sku_category_map t5 ON t5.store_id = t1.store_id AND t5.sku_category_id = t4.id
LEFT JOIN store_sku_category_map t5p ON t5p.store_id = t1.store_id AND t5p.sku_category_id = t4p.id
LEFT JOIN sku_vendor_category cat1 ON t3.category_id = cat1.vendor_category_id AND cat1.vendor_id = ?
LEFT JOIN sku_vendor_category cat2 ON cat1.parent_id = cat2.vendor_category_id AND cat1.vendor_id = ?
WHERE t1.store_id = ? AND (t1.ebai_sync_status <> 0)
`
sqlParams := []interface{}{
model.VendorIDEBAI,
model.VendorIDEBAI,
storeID,
}
if skuIDs != nil && len(skuIDs) > 0 {
sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs)
}
strStoreID := utils.Int2Str(storeID)
var storeSkuInfoList []*tStoreSkuFullInfo
if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil {
globals.SugarLogger.Debug(utils.Format4Output(storeSkuInfoList, false))
level1CatList2Add := make(map[string]interface{})
level2CatList2Add := make(map[string]interface{})
for _, storeSku := range storeSkuInfoList {
if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
if storeSku.ParentCatEbaiID == 0 {
level1CatList2Add[utils.Int2Str(storeSku.ParentCatID)] = map[string]interface{}{
ebaiapi.KeyShopID: strStoreID,
"parent_category_id": 0,
"name": utils.FilterMb4(storeSku.ParentCatName),
"shop_custom_id": utils.Int2Str(storeSku.ParentCatID),
"rank": storeSku.ParentCatLevel + 1, // 饿百是从1开始
}
}
}
}
globals.SugarLogger.Debug(utils.Format4Output(level1CatList2Add, false))
level1CatList := utils.MapKV2List(level1CatList2Add)
task := tasksch.RunTask("syncOneStoreSkus level1 cat", false, nil, 0, 1, userName, func(batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
cat := batchItemList[0].(map[string]interface{})
globals.SugarLogger.Debug(strStoreID, 0, cat["name"].(string), cat["rank"].(int), cat["shop_custom_id"].(string))
ebaiCatID, err2 := api.EbaiAPI.ShopCategoryCreate(strStoreID, 0, cat["name"].(string), cat["rank"].(int), cat["shop_custom_id"].(string))
if err = err2; err == nil {
cat["category_id"] = ebaiCatID
return nil, nil
}
return nil, err
}, level1CatList)
if _, err = task.GetResult(0); err == nil {
for _, storeSku := range storeSkuInfoList {
if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
if storeSku.CatEbaiID == 0 {
level2CatList2Add[utils.Int2Str(storeSku.CatID)] = map[string]interface{}{
ebaiapi.KeyShopID: strStoreID,
"parent_category_id": level1CatList2Add[utils.Int2Str(storeSku.ParentCatID)].(map[string]interface{})["category_id"],
"name": utils.FilterMb4(storeSku.CatName),
"shop_custom_id": utils.Int2Str(storeSku.CatID),
"rank": storeSku.CatLevel + 1, // 饿百是从1开始
}
}
}
}
level2CatList := utils.MapKV2List(level1CatList2Add)
task = tasksch.RunTask("syncOneStoreSkus level2 cat", false, nil, 0, 1, userName, func(batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
cat := batchItemList[0].(map[string]interface{})
ebaiCatID, err2 := api.EbaiAPI.ShopCategoryCreate(strStoreID, 0, cat["name"].(string), cat["rank"].(int), cat["shop_custom_id"].(string))
if err = err2; err == nil {
cat["category_id"] = ebaiCatID
return nil, nil
}
return nil, err
}, level2CatList)
if _, err = task.GetResult(0); err == nil {
task = tasksch.RunTask("syncOneStoreSkus skus", false, nil, 0, 1, userName, func(batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeSku := batchItemList[0].(*tStoreSkuFullInfo)
if storeSku.ParentCatEbaiID == 0 {
storeSku.ParentCatEbaiID = level1CatList2Add[utils.Int2Str(storeSku.ParentCatID)].(map[string]interface{})["category_id"].(int64)
}
if storeSku.CatEbaiID == 0 {
storeSku.CatEbaiID = level1CatList2Add[utils.Int2Str(storeSku.CatID)].(map[string]interface{})["category_id"].(int64)
}
updateFields := []string{model.FieldEbaiSyncStatus}
if storeSku.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 {
err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID))
} else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku))
updateFields = append(updateFields, model.FieldEbaiID)
} else if storeSku.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 {
_, err = api.EbaiAPI.SkuUpdate(strStoreID, genSkuParamsFromStoreSkuInfo(storeSku))
}
if err == nil {
_, err = dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...)
}
return nil, err
}, storeSkuInfoList)
_, err = task.GetResult(0)
}
}
}
return err
}
func (p *PurchaseHandler) SyncStoreCategories(db *dao.DaoDB, storeIDs []int, catIDs []int) (err error) {
// sql := `
// SELECT t1.*, t2.spec_quality, t2.spec_unit, t2.weight,
// t3.prefix, t3.name, t3.comment, t3.is_global, t3.unit, t3.img,
// t4.ebai_category_id, t4.name cat_name, t5.ebai_id cat_id, t5.ebai_category_id
// FROM store_sku_bind t1
// JOIN sku t2 ON t1.sku_id = t2.skuIDs
// JOIN sku_name t3 ON t2.name_id = t3.id
// JOIN sku_category t4 ON t3.category_id = t4.id
// LEFT JOIN store_sku_category_map t5 ON t5.store_id = t1.store_id AND t5.sku_category_id = t4.id
// WHERE t1.store_id = ? AND (t1.ebai_sync_status <> 0
// `
return err
}
func (p *PurchaseHandler) syncOneStoreCategory(db *dao.DaoDB, storeIDs []int, catIDs []int) (err error) {
return err
}
func (p *PurchaseHandler) ReadStoreCategories(storeID int) (cats []*model.SkuCategory, err error) {
return cats, err
}
func (p *PurchaseHandler) ReadStoreSku(storeID, skuID int) (skuNameExt *model.SkuNameExt, err error) {
return skuNameExt, err
}
func genSkuParamsFromStoreSkuInfo(storeSku *tStoreSkuFullInfo) map[string]interface{} {
return map[string]interface{}{
"name": jxutils.ComposeSkuName(storeSku.Prefix, storeSku.Name, storeSku.Comment, storeSku.Unit, storeSku.SpecQuality, storeSku.SpecUnit, 0),
"status": jxSkuStatus2Ebai(jxutils.MergeSkuStatus(storeSku.SkuStatus, storeSku.Status)),
"left_num": ebaiapi.MaxLeftNum,
"sale_price": storeSku.Price,
"cat1": getEbaiCat(storeSku.EbaiCat1ID, 1),
"cat2": getEbaiCat(storeSku.EbaiCat2ID, 2),
"cat3": getEbaiCat(storeSku.EbaiCat3ID, 3),
"photos": []map[string]interface{}{
map[string]interface{}{
"is_master": true,
"url": storeSku.Img,
},
},
}
}
func jxSkuStatus2Ebai(status int) int {
if status <= 0 {
return ebaiapi.SkuStatusOffline
}
return ebaiapi.SkuStatusOnline
}
func getEbaiCat(catID string, level int) string {
if catID == "" {
return defCatMap[level]
}
return catID
}