From 195866712baab5850e49b7dd56b4f68d3a802e89 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 25 May 2019 13:05:21 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84GetSkusCategories?= =?UTF-8?q?=E4=B8=8EGetStoreCategories?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/dao/store_sku.go | 23 ++-- business/partner/purchase/mtwm/store_sku.go | 83 +++++++------- .../partner/purchase/weimob/wsc/store_sku.go | 101 +++++++++++------- 3 files changed, 113 insertions(+), 94 deletions(-) diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 9e79796a3..e1af5d9f7 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -30,17 +30,6 @@ type SkuStoreCatInfo struct { ParentCatSyncStatus int8 } -type StoreCatSyncInfo struct { - CatName string - Seq int `json:"seq"` - model.StoreSkuCategoryMap - - ParentCatName string - ParentCatID int `orm:"column(parent_cat_id)"` // 这个主要用于判断是否有父store_sku_category_map - ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` - ParentCatSyncStatus int8 -} - type StoreSkuSyncInfo struct { // 平台无关的store sku信息 BindID int `orm:"column(bind_id)"` // 换名的原因是与Sku.ID同名区别 @@ -82,6 +71,7 @@ type StoreSkuSyncInfo struct { } // 单门店模式厂商适用 +// 从store_sku_bind中,得到所有依赖的商家分类信息 func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int) (cats []*SkuStoreCatInfo, err error) { sql := ` SELECT DISTINCT t4.*, t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status store_cat_sync_status, t4p.name parent_cat_name, t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status @@ -129,19 +119,20 @@ func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int } // 单门店模式厂商适用 -func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*StoreCatSyncInfo, err error) { +// 单纯的从已经创建的store_sku_category_map中,得到相关的同步信息 +func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*SkuStoreCatInfo, err error) { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := fmt.Sprintf(` - SELECT t5.*, - t4.name cat_name, t4.seq, + SELECT t4.*, + t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status store_cat_sync_status, t4p.name parent_cat_name, - t5p.category_id parent_cat_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status + t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status FROM store_sku_category_map t5 JOIN sku_category t4 ON t5.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id AND t5p.deleted_at = ? WHERE t5.store_id = ? AND t4.level = ? AND t5.%s_sync_status <> 0 AND t5.deleted_at = ? - `, fieldPrefix, fieldPrefix, fieldPrefix) + `, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) if err = GetRows(db, &cats, sql, utils.DefaultTimeValue, utils.DefaultTimeValue, storeID, level, utils.DefaultTimeValue); err != nil { return nil, err } diff --git a/business/partner/purchase/mtwm/store_sku.go b/business/partner/purchase/mtwm/store_sku.go index f5658532a..abe698987 100644 --- a/business/partner/purchase/mtwm/store_sku.go +++ b/business/partner/purchase/mtwm/store_sku.go @@ -35,44 +35,49 @@ func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask t task := tasksch.NewParallelTask(fmt.Sprintf("美团外卖SyncStoreCategory step2, level=%d", level), nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDMTWM])} - catInfo := batchItemList[0].(*dao.StoreCatSyncInfo) - if globals.EnableMtwmStoreWrite { - if catInfo.MtwmSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 - if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 && catInfo.MtwmID != "" { - globals.SugarLogger.Debugf("RetailCatDelete vendorStoreID:%s, MtwmID:%s", vendorStoreID, catInfo.MtwmID) - err = api.MtwmAPI.RetailCatDelete(vendorStoreID, catInfo.MtwmID) + catInfo := batchItemList[0].(*dao.SkuStoreCatInfo) + storeCatMap := &model.StoreSkuCategoryMap{} + storeCatMap.ID = catInfo.MapID + if catInfo.StoreCatSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 + if catInfo.StoreCatSyncStatus&model.SyncFlagNewMask == 0 && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) { + globals.SugarLogger.Debugf("RetailCatDelete vendorStoreID:%s, MtwmID:%s", vendorStoreID, catInfo.VendorCatID) + if globals.EnableMtwmStoreWrite { + err = api.MtwmAPI.RetailCatDelete(vendorStoreID, catInfo.VendorCatID) } - } else if catInfo.MtwmSyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreSkuModifiedMask) != 0 { // 新增 - catName := catInfo.CatName - subCatName := "" - originName := "" - if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { - originName = catInfo.MtwmID - } - if level == 2 { - originName = catInfo.ParentCatName - catName = catInfo.ParentCatName - subCatName = catInfo.CatName - if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { - originName = catInfo.MtwmID - catName = catInfo.CatName - subCatName = "" - } - } - if catName == "" { - panic("catName is empty") - } - globals.SugarLogger.Debugf("RetailCatUpdate vendorStoreID:%s, originName:%s, catName:%s, subCatName:%s, seq:%d", vendorStoreID, originName, catName, subCatName, catInfo.Seq) - if err = api.MtwmAPI.RetailCatUpdate(vendorStoreID, originName, catName, subCatName, catInfo.Seq); err == nil { - catInfo.MtwmID = catInfo.CatName - updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDMTWM])) + } + } else if catInfo.StoreCatSyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreSkuModifiedMask) != 0 { // 新增 + catName := catInfo.Name + subCatName := "" + originName := "" + if catInfo.StoreCatSyncStatus&model.SyncFlagNewMask == 0 { + originName = catInfo.VendorCatID + } + if level == 2 { + originName = catInfo.ParentCatName + catName = catInfo.ParentCatName + subCatName = catInfo.Name + if catInfo.StoreCatSyncStatus&model.SyncFlagNewMask == 0 { + originName = catInfo.VendorCatID + catName = catInfo.Name + subCatName = "" } } + if catName == "" { + panic("catName is empty") + } + globals.SugarLogger.Debugf("RetailCatUpdate vendorStoreID:%s, originName:%s, catName:%s, subCatName:%s, seq:%d", vendorStoreID, originName, catName, subCatName, catInfo.Seq) + if globals.EnableMtwmStoreWrite { + err = api.MtwmAPI.RetailCatUpdate(vendorStoreID, originName, catName, subCatName, catInfo.Seq) + } + if err == nil { + storeCatMap.MtwmID = catInfo.Name + updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDMTWM])) + } } if err == nil { db2 := dao.GetDB() - catInfo.MtwmSyncStatus = 0 - _, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...) + storeCatMap.MtwmSyncStatus = 0 + _, err = dao.UpdateEntity(db2, storeCatMap, updateFields...) } return nil, err }, catList) @@ -258,7 +263,10 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks storeSkuBind.ID = skuItem.BindID if skuItem.NameID == 0 || skuItem.StoreSkuSyncStatus&model.SyncFlagDeletedMask != 0 { if skuItem.StoreSkuSyncStatus&model.SyncFlagNewMask == 0 && !dao.IsVendorThingIDEmpty(skuItem.VendorSkuID) { - err = ignoreNoAppFoodErr(api.MtwmAPI.RetailDelete(vendorStoreID, skuItem.VendorSkuID)) + if globals.EnableWscStoreWrite { + err = api.MtwmAPI.RetailDelete(vendorStoreID, skuItem.VendorSkuID) + } + err = ignoreNoAppFoodErr(err) } if err == nil { storeSkuBind.DeletedAt = time.Now() @@ -312,10 +320,11 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks skus[0]["weight"] = skuItem.Weight // weight字段仅限服饰鞋帽、美妆、日用品、母婴、生鲜果蔬、生活超市下的便利店/超市门店品类的商家使用 } if globals.EnableMtwmStoreWrite { - if err = api.MtwmAPI.RetailBatchInitData(vendorStoreID, foodDataList); err == nil { - storeSkuBind.MtwmID = int64(skuItem.SkuID) - updateFields = append(updateFields, model.FieldMtwmID) - } + err = api.MtwmAPI.RetailBatchInitData(vendorStoreID, foodDataList) + } + if err == nil { + storeSkuBind.MtwmID = int64(skuItem.SkuID) + updateFields = append(updateFields, model.FieldMtwmID) } } } else { diff --git a/business/partner/purchase/weimob/wsc/store_sku.go b/business/partner/purchase/weimob/wsc/store_sku.go index bc73cb84f..2e926ba4b 100644 --- a/business/partner/purchase/weimob/wsc/store_sku.go +++ b/business/partner/purchase/weimob/wsc/store_sku.go @@ -37,29 +37,36 @@ func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask t task := tasksch.NewParallelTask(fmt.Sprintf("微盟微商城SyncStoreCategory step2, level=%d", level), nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDWSC])} - catInfo := batchItemList[0].(*dao.StoreCatSyncInfo) - if globals.EnableWscStoreWrite { - if catInfo.WscSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 - if catInfo.WscSyncStatus&model.SyncFlagNewMask == 0 { - globals.SugarLogger.Debugf("UpdateClassify strStoreID:%s, WscID:%d", strStoreID, catInfo.WscID) - err = api.WeimobAPI.UpdateClassify(catInfo.WscID, composeFakeDelName(catInfo.CatName), "") + catInfo := batchItemList[0].(*dao.SkuStoreCatInfo) + storeCatMap := &model.StoreSkuCategoryMap{} + storeCatMap.ID = catInfo.MapID + if catInfo.StoreCatSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 + if catInfo.StoreCatSyncStatus&model.SyncFlagNewMask == 0 && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) { + globals.SugarLogger.Debugf("UpdateClassify strStoreID:%s, WscID:%s", strStoreID, catInfo.VendorCatID) + if globals.EnableWscStoreWrite { + err = api.WeimobAPI.UpdateClassify(utils.Str2Int64(catInfo.VendorCatID), composeFakeDelName(catInfo.Name), "") } - } else if catInfo.WscSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增 - catImg := "" - if level == 2 { - catImg = DefCatImg - } - if catInfo.WscID, err = api.WeimobAPI.AddClassify(catInfo.CatName, utils.Str2Int64WithDefault(catInfo.ParentVendorCatID, 0), catImg); err == nil { - updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDWSC])) - } - } else if catInfo.WscSyncStatus&(model.SyncFlagModifiedMask) != 0 { // 修改 - err = api.WeimobAPI.UpdateClassify(catInfo.WscID, catInfo.CatName, "") + } + } else if catInfo.StoreCatSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增 + catImg := "" + if level == 2 { + catImg = DefCatImg + } + if globals.EnableWscStoreWrite { + storeCatMap.WscID, err = api.WeimobAPI.AddClassify(catInfo.Name, utils.Str2Int64WithDefault(catInfo.ParentVendorCatID, 0), catImg) + } + if err == nil { + updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDWSC])) + } + } else if catInfo.StoreCatSyncStatus&(model.SyncFlagModifiedMask) != 0 { // 修改 + if globals.EnableWscStoreWrite { + err = api.WeimobAPI.UpdateClassify(utils.Str2Int64(catInfo.VendorCatID), catInfo.Name, "") } } if err == nil { db2 := dao.GetDB() - catInfo.WscSyncStatus = 0 - _, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...) + storeCatMap.WscSyncStatus = 0 + _, err = dao.UpdateEntity(db2, storeCatMap, updateFields...) } return nil, err }, catList) @@ -183,10 +190,12 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks if skuItem.StoreSkuSyncStatus&model.SyncFlagDeletedMask != 0 { if skuItem.StoreSkuSyncStatus&model.SyncFlagNewMask == 0 { goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0) - if err = api.WeimobAPI.UpdateGoodsShelfStatus([]int64{goodsID}, false); err == nil { - err = api.WeimobAPI.UpdateGoodsTitle(goodsID, composeFakeDelName(skuItem.Name)) - } else if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.Code() == "1001930300001" { // 商品不存在错 - err = nil // 强制忽略 + if globals.EnableWscStoreWrite { + if err = api.WeimobAPI.UpdateGoodsShelfStatus([]int64{goodsID}, false); err == nil { + err = api.WeimobAPI.UpdateGoodsTitle(goodsID, composeFakeDelName(skuItem.Name)) + } else if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.Code() == "1001930300001" { // 商品不存在错 + err = nil // 强制忽略 + } } } } else if skuItem.StoreSkuSyncStatus&(model.SyncFlagStoreSkuModifiedMask|model.SyncFlagNewMask) != 0 { @@ -222,26 +231,36 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks }, }, } - if globals.EnableWscStoreWrite { - if skuItem.StoreSkuSyncStatus&model.SyncFlagNewMask != 0 { - goodsID, skuMap, err2 := api.WeimobAPI.AddGoods(outerGoodsCode, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil) - if err = err2; err == nil { - storeSkuBind.WscID = skuMap[utils.Int2Str(skuItem.ID)] - storeSkuBind.WscID2 = goodsID - updateFields = append(updateFields, model.FieldWscID, model.FieldWscID2) - } + if skuItem.StoreSkuSyncStatus&model.SyncFlagNewMask != 0 { + var ( + goodsID int64 + skuMap map[string]int64 + ) + if globals.EnableWscStoreWrite { + goodsID, skuMap, err = api.WeimobAPI.AddGoods(outerGoodsCode, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil) } else { - goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0) - - goodsInfo, err2 := api.WeimobAPI.QueryGoodsDetail(goodsID) - if err = err2; err == nil { - // http://open.weimob.com/docapi/article?tag=Af - // sku id,如果为空,则新增sku; 如果更新之前的skuId与入参skuId对应,则更新sku; 如果更新之前的skuId没有和入参的skuId对应,删除更新之前的sku - skuList[0][weimobapi.KeySkuID] = utils.Str2Int64WithDefault(skuItem.VendorSkuID, 0) - remoteSkuList := goodsInfo[weimobapi.KeySkuList].([]interface{}) - if len(remoteSkuList) > 0 { - // skuList[0][weimobapi.KeyEditStockNum] = model.MaxStoreSkuStockQty - int(utils.MustInterface2Int64(remoteSkuList[0].(map[string]interface{})[weimobapi.KeyAvailableStockNum])) - } + goodsID = jxutils.GenFakeID() + skuMap = map[string]int64{ + utils.Int2Str(skuItem.ID): jxutils.GenFakeID(), + } + } + if err == nil { + storeSkuBind.WscID = skuMap[utils.Int2Str(skuItem.ID)] + storeSkuBind.WscID2 = goodsID + updateFields = append(updateFields, model.FieldWscID, model.FieldWscID2) + } + } else { + goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0) + goodsInfo, err2 := api.WeimobAPI.QueryGoodsDetail(goodsID) + if err = err2; err == nil { + // http://open.weimob.com/docapi/article?tag=Af + // sku id,如果为空,则新增sku; 如果更新之前的skuId与入参skuId对应,则更新sku; 如果更新之前的skuId没有和入参的skuId对应,删除更新之前的sku + skuList[0][weimobapi.KeySkuID] = utils.Str2Int64WithDefault(skuItem.VendorSkuID, 0) + remoteSkuList := goodsInfo[weimobapi.KeySkuList].([]interface{}) + if len(remoteSkuList) > 0 { + // skuList[0][weimobapi.KeyEditStockNum] = model.MaxStoreSkuStockQty - int(utils.MustInterface2Int64(remoteSkuList[0].(map[string]interface{})[weimobapi.KeyAvailableStockNum])) + } + if globals.EnableWscStoreWrite { _, _, err = api.WeimobAPI.UpdateGoods(goodsID, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil) } }