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 }