556 lines
24 KiB
Go
556 lines
24 KiB
Go
package ebai
|
||
|
||
// type tStoreSkuFullInfo struct {
|
||
// model.StoreSkuBind
|
||
|
||
// NameID int `orm:"column(name_id)"`
|
||
|
||
// 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
|
||
// Upc string
|
||
// DescImgEbai string
|
||
|
||
// CatName string `orm:"size(255)"`
|
||
|
||
// CatMapID int `orm:"column(cat_map_id)"`
|
||
// CatID int `orm:"column(cat_id)"`
|
||
// CatEbaiID int64 `orm:"column(cat_ebai_id)"`
|
||
|
||
// ParentCatMapID int `orm:"column(parent_cat_map_id)"`
|
||
// ParentCatID int `orm:"column(parent_cat_id)"`
|
||
// ParentCatEbaiID int64 `orm:"column(parent_cat_ebai_id)"`
|
||
|
||
// EbaiCat1ID int64 `orm:"column(ebai_cat1_id)"`
|
||
// EbaiCat2ID int64 `orm:"column(ebai_cat2_id)"`
|
||
// EbaiCat3ID int64 `orm:"column(ebai_cat3_id)"`
|
||
|
||
// CatPricePercentage int
|
||
// }
|
||
|
||
// type tStoreCatInfo struct {
|
||
// model.StoreSkuCategoryMap
|
||
// CatID int `orm:"column(cat_id)"`
|
||
// Name string
|
||
// ParentID int `orm:"column(parent_id)"`
|
||
// Level int
|
||
// Type int
|
||
// Seq int
|
||
|
||
// ParentEbaiID int64 `orm:"column(parent_ebai_id)"`
|
||
// Children map[string]*tStoreCatInfo `orm:"-"`
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) getDirtyStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int) (storeSkuInfoList []*tStoreSkuFullInfo, err error) {
|
||
// sql := `
|
||
// SELECT
|
||
// t1.*, t2.spec_quality, t2.spec_unit, t2.weight, t2.status sku_status,
|
||
// t3.id name_id, t3.prefix, t3.name, t2.comment, t3.is_global, t3.unit, IF(t3.img_ebai <> '', t3.img_ebai, t3.img) img, t3.upc, t3.desc_img_ebai,
|
||
// t4.name cat_name, t4.ebai_price_percentage cat_price_percentage,
|
||
// t4.id cat_id,
|
||
// t5.id cat_map_id, t5.ebai_id cat_ebai_id,
|
||
// t4p.id parent_cat_id,
|
||
// t5p.id parent_cat_map_id, t5p.ebai_id parent_cat_ebai_id,
|
||
// cat1.vendor_category_id ebai_cat3_id, cat2.vendor_category_id ebai_cat2_id, cat2.parent_id ebai_cat1_id
|
||
// FROM store_sku_bind t1
|
||
// LEFT JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? AND t2.status = ?
|
||
// LEFT JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? AND t3.status = ?
|
||
// LEFT JOIN sku_category t4 ON t3.category_id = t4.id
|
||
// LEFT 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.category_id = t4.id AND t5.deleted_at = ?
|
||
// LEFT JOIN store_sku_category_map t5p ON t5p.store_id = t1.store_id AND t5p.category_id = t4p.id AND t5p.deleted_at = ?
|
||
// LEFT JOIN sku_vendor_category cat1 ON t4.ebai_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 OR (t1.ebai_id <> 0 AND t3.id IS NULL))
|
||
// `
|
||
// sqlParams := []interface{}{
|
||
// utils.DefaultTimeValue,
|
||
// model.SkuStatusNormal,
|
||
// utils.DefaultTimeValue,
|
||
// model.SkuStatusNormal,
|
||
// utils.DefaultTimeValue,
|
||
// utils.DefaultTimeValue,
|
||
// model.VendorIDEBAI,
|
||
// model.VendorIDEBAI,
|
||
// storeID,
|
||
// }
|
||
// if len(skuIDs) > 0 {
|
||
// sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")"
|
||
// sqlParams = append(sqlParams, skuIDs)
|
||
// }
|
||
// sql += " ORDER BY t1.price DESC"
|
||
// err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...)
|
||
// return storeSkuInfoList, err
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) createCatByStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, storeID int, storeSkuInfoList []*tStoreSkuFullInfo) (num int64, err error) {
|
||
// catList2Add := make(map[int]int)
|
||
// for _, storeSku := range storeSkuInfoList {
|
||
// if storeSku.CatID != 0 && storeSku.EbaiSyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreSkuModifiedMask) != 0 && storeSku.Status == model.SkuStatusNormal {
|
||
// if storeSku.ParentCatMapID == 0 && storeSku.ParentCatID != 0 {
|
||
// catList2Add[storeSku.ParentCatID] = 1
|
||
// }
|
||
// if storeSku.CatMapID == 0 {
|
||
// catList2Add[storeSku.CatID] = 1
|
||
// }
|
||
// }
|
||
// }
|
||
// num = int64(len(catList2Add))
|
||
// if num > 0 {
|
||
// for k := range catList2Add {
|
||
// if err = dao.AddStoreCategoryMap(db, storeID, k, model.VendorIDEBAI, "", model.SyncFlagNewMask, ctx.GetUserName()); err != nil {
|
||
// return 0, err
|
||
// }
|
||
// }
|
||
// if _, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil {
|
||
// return 0, err
|
||
// }
|
||
// }
|
||
// return num, nil
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) FullSyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||
// userName := ctx.GetUserName()
|
||
// globals.SugarLogger.Debugf("ebai FullSyncStoreSkus storeID:%d, isContinueWhenError:%t, userName:%s", storeID, isContinueWhenError, userName)
|
||
|
||
// db := dao.GetDB()
|
||
// storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDEBAI)
|
||
// if err != nil {
|
||
// return "", err
|
||
// }
|
||
// rootTask := tasksch.NewSeqTask("FullSyncStoreSkus", ctx,
|
||
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||
// switch step {
|
||
// case 0:
|
||
// err = p.DeleteStoreAllSkus(ctx, rootTask, storeID, storeDetail.VendorStoreID, isContinueWhenError)
|
||
// // 强制忽略删除SKU错误
|
||
// if isContinueWhenError {
|
||
// err = nil
|
||
// }
|
||
// if err == nil {
|
||
// _, err = dao.SetStoreSkuSyncStatus(db, model.VendorIDEBAI, []int{storeID}, nil, model.SyncFlagNewMask)
|
||
// }
|
||
// case 1:
|
||
// if err = p.DeleteStoreAllCategories(ctx, rootTask, storeID, storeDetail.VendorStoreID, isContinueWhenError); err == nil {
|
||
// _, err = dao.SetStoreCategorySyncStatus(db, model.VendorIDEBAI, []int{storeID}, nil, model.SyncFlagNewMask)
|
||
// }
|
||
// case 2:
|
||
// err = p.SyncLocalStoreCategory(db, storeID, userName)
|
||
// case 3:
|
||
// _, err = p.SyncStoreCategory(ctx, rootTask, storeID, false)
|
||
// case 4:
|
||
// _, err = p.SyncStoreSkus(ctx, rootTask, storeID, nil, false, isContinueWhenError)
|
||
// }
|
||
// return nil, err
|
||
// }, 5)
|
||
// tasksch.AddChild(parentTask, rootTask).Run()
|
||
// if !isAsync {
|
||
// _, err = rootTask.GetResult(0)
|
||
// }
|
||
// return rootTask.ID, err
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||
// db := dao.GetDB()
|
||
// storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDEBAI)
|
||
// if err != nil {
|
||
// return "", err
|
||
// }
|
||
// return p.syncStoreSkus(ctx, parentTask, storeDetail, skuIDs, isAsync, isContinueWhenError)
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) syncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeDetail *dao.StoreDetail, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||
// storeID := storeDetail.Store.ID
|
||
// userName := ctx.GetUserName()
|
||
// globals.SugarLogger.Debugf("ebai SyncStoreSkus storeID:%d, skuIDs:%v, isContinueWhenError:%t, userName:%s", storeID, skuIDs, isContinueWhenError, userName)
|
||
|
||
// var storeSkuInfoList []*tStoreSkuFullInfo
|
||
// var num int64
|
||
// strStoreID := utils.Int2Str(storeID)
|
||
|
||
// rootTask := tasksch.NewSeqTask("SyncStoreSkus饿百1", ctx,
|
||
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||
// if step == 0 {
|
||
// db := dao.GetDB()
|
||
// if _, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil {
|
||
// return nil, err
|
||
// }
|
||
// for i := 0; i < 3; i++ {
|
||
// if storeSkuInfoList, err = p.getDirtyStoreSkus(db, storeID, skuIDs); err != nil {
|
||
// return nil, err
|
||
// }
|
||
// if num, err = p.createCatByStoreSkus(ctx, rootTask, db, storeID, storeSkuInfoList); err != nil {
|
||
// return nil, err
|
||
// }
|
||
// if num == 0 {
|
||
// break
|
||
// }
|
||
// if _, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil {
|
||
// return nil, err
|
||
// }
|
||
// }
|
||
// if num != 0 {
|
||
// globals.SugarLogger.Infof("SyncStoreSkus 不能创建商品所需的类别, storeID:%d, skuIDs:%v, isContinueWhenError:%t, userName:%s", storeID, skuIDs, isContinueWhenError, userName)
|
||
// return nil, errors.New("不能创建商品所需的类别")
|
||
// }
|
||
// } else if step == 1 {
|
||
// task := tasksch.NewParallelTask("SyncStoreSkus饿百2", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||
// func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||
// storeSku := batchItemList[0].(*tStoreSkuFullInfo)
|
||
// pricePercentage := jxutils.GetPricePercentage(storeDetail.PricePercentagePackObj, storeSku.Price, int(storeDetail.PricePercentage))
|
||
// // globals.SugarLogger.Debugf("skuID:%d, price:%d, pricePercentage:%d", storeSku.SkuID, storeSku.Price, pricePercentage)
|
||
// // globals.SugarLogger.Debugf(utils.Format4Output(storeDetail.PricePercentagePackObj, false))
|
||
// updateFields := []string{model.FieldEbaiSyncStatus}
|
||
// syncStatus := int8(0)
|
||
// if storeSku.NameID == 0 || storeSku.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 {
|
||
// if storeSku.EbaiSyncStatus&model.SyncFlagNewMask == 0 && !jxutils.IsEmptyID(storeSku.EbaiID) {
|
||
// if globals.EnableEbaiStoreWrite {
|
||
// opResult, err2 := api.EbaiAPI.SkuDelete(ctx.GetTrackInfo(), strStoreID, []int64{storeSku.EbaiID}, nil)
|
||
// if err = err2; err != nil {
|
||
// if ebaiapi.IsErrSkuNotExist(err) || (opResult != nil && len(opResult.FailedList) == 1) {
|
||
// err = nil
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// if err == nil {
|
||
// if utils.IsTimeZero(storeSku.DeletedAt) {
|
||
// storeSku.DeletedAt = time.Now()
|
||
// updateFields = append(updateFields, model.FieldDeletedAt)
|
||
// }
|
||
// storeSku.EbaiID = 0
|
||
// updateFields = append(updateFields, model.FieldEbaiID)
|
||
// }
|
||
// } else {
|
||
// if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
|
||
// // globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false))
|
||
// // todo 适当处理重复(即已经创建)的情况
|
||
// mergedStoreSkuStatus := jxutils.MergeSkuStatus(storeSku.SkuStatus, storeSku.Status)
|
||
// if mergedStoreSkuStatus == model.SkuStatusNormal { // 待创建且不可售的,暂不新建
|
||
// if storeSku.Img != "" {
|
||
// if globals.EnableEbaiStoreWrite {
|
||
// if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(ctx.GetTrackInfo(), strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(pricePercentage, storeSku)); err == nil {
|
||
// utils.AfterFuncWithRecover(5*time.Second, func() {
|
||
// api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, "", storeSku.CatEbaiID, ebaiapi.MaxSkuCatRank-storeSku.Price)
|
||
// })
|
||
// }
|
||
// } else {
|
||
// storeSku.EbaiID = jxutils.GenFakeID()
|
||
// }
|
||
// if err == nil {
|
||
// updateFields = append(updateFields, model.FieldEbaiID)
|
||
// } else if ebaiapi.IsErrSkuExist(err) {
|
||
// if storeSku.EbaiID = api.EbaiAPI.GetEbaiSkuIDFromCustomID(strStoreID, utils.Int2Str(storeSku.SkuID)); storeSku.EbaiID > 0 {
|
||
// err = nil
|
||
// updateFields = append(updateFields, model.FieldEbaiID)
|
||
// if err2 := skuUpdate(ctx, strStoreID, pricePercentage, storeSku); err2 != nil {
|
||
// syncStatus = model.SyncFlagStoreSkuModifiedMask
|
||
// }
|
||
// }
|
||
// }
|
||
// } else {
|
||
// err = fmt.Errorf("SKUANME%d:%s没有图片,同步失败", storeSku.NameID, storeSku.Name)
|
||
// }
|
||
// } else {
|
||
// updateFields = nil
|
||
// }
|
||
// } else if storeSku.EbaiSyncStatus&model.SyncFlagStoreSkuModifiedMask != 0 {
|
||
// if jxutils.IsEmptyID(storeSku.EbaiID) {
|
||
// err = fmt.Errorf("京西数据异常,修改一个没有创建的饿百商品:%d, store:%s", storeSku.SkuID, strStoreID)
|
||
// } else {
|
||
// if storeSku.Img != "" {
|
||
// err = skuUpdate(ctx, strStoreID, pricePercentage, storeSku)
|
||
// } else {
|
||
// err = fmt.Errorf("SKUANME%d:%s没有图片,同步失败", storeSku.NameID, storeSku.Name)
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// if err == nil {
|
||
// if len(updateFields) > 0 {
|
||
// storeSku.EbaiSyncStatus = syncStatus
|
||
// _, err = dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...)
|
||
// }
|
||
// } else if isErrModifyPrice(err) {
|
||
// // err = partner.NewErrorCode(err.Error(), partner.ErrCodeChangePriceFailed, model.VendorIDEBAI)
|
||
// }
|
||
// return nil, err
|
||
// }, storeSkuInfoList)
|
||
// tasksch.AddChild(rootTask, task).Run()
|
||
// _, err = task.GetResult(0)
|
||
// }
|
||
// return nil, err
|
||
// }, 2)
|
||
// tasksch.AddChild(parentTask, rootTask).Run()
|
||
// if !isAsync {
|
||
// _, err = rootTask.GetResult(0)
|
||
// }
|
||
// return rootTask.ID, err
|
||
// }
|
||
|
||
// func skuUpdate(ctx *jxcontext.Context, strStoreID string, pricePercentage int, storeSku *tStoreSkuFullInfo) (err error) {
|
||
// if globals.EnableEbaiStoreWrite {
|
||
// if _, err = api.EbaiAPI.SkuUpdate(ctx.GetTrackInfo(), strStoreID, storeSku.EbaiID, genSkuParamsFromStoreSkuInfo(pricePercentage, storeSku)); err != nil {
|
||
// // 如果是改价错误,尝试把价格标志去掉再同步
|
||
// if isErrModifyPrice(err) {
|
||
// storeSku.EbaiSyncStatus = storeSku.EbaiSyncStatus & ^model.SyncFlagPriceMask
|
||
// if storeSku.EbaiSyncStatus != 0 {
|
||
// if _, err2 := api.EbaiAPI.SkuUpdate(ctx.GetTrackInfo(), strStoreID, storeSku.EbaiID, genSkuParamsFromStoreSkuInfo(pricePercentage, storeSku)); err2 != nil {
|
||
// err = err2
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// return err
|
||
// }
|
||
|
||
// func isErrModifyPrice(err error) bool {
|
||
// if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 1 {
|
||
// for _, v := range []string{
|
||
// "无法修改价格",
|
||
// "sku_参加营销活动",
|
||
// } {
|
||
// if strings.Index(errExt.ErrMsg(), v) >= 0 {
|
||
// return true
|
||
// }
|
||
// }
|
||
// }
|
||
// return false
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error) {
|
||
// return hint, err
|
||
// }
|
||
|
||
// ///////////
|
||
// func genSkuParamsFromStoreSkuInfo(pricePercentage int, storeSku *tStoreSkuFullInfo) (params map[string]interface{}) {
|
||
// price := jxutils.CaculateSkuVendorPrice(storeSku.Price, pricePercentage, storeSku.CatPricePercentage)
|
||
// params = map[string]interface{}{
|
||
// "name": utils.LimitMixedStringLen(jxutils.ComposeSkuName(storeSku.Prefix, storeSku.Name, storeSku.Comment, storeSku.Unit, storeSku.SpecQuality, storeSku.SpecUnit, 0), ebaiapi.MaxSkuNameByteCount),
|
||
// "left_num": model.MaxStoreSkuStockQty,
|
||
// "category_id": storeSku.CatEbaiID,
|
||
// "predict_cat": 0, // 不使用推荐类目
|
||
// "cat1_id": getEbaiCat(storeSku.EbaiCat1ID, 1),
|
||
// "cat2_id": getEbaiCat(storeSku.EbaiCat2ID, 2),
|
||
// "cat3_id": getEbaiCat(storeSku.EbaiCat3ID, 3),
|
||
// "weight": storeSku.Weight,
|
||
// "photos": []map[string]interface{}{
|
||
// map[string]interface{}{
|
||
// "is_master": true,
|
||
// "url": storeSku.Img,
|
||
// },
|
||
// },
|
||
// }
|
||
// if storeSku.DescImgEbai != "" {
|
||
// params["rtf"] = storeSku.DescImgEbai
|
||
// }
|
||
// if storeSku.EbaiSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 {
|
||
// params["sale_price"] = price
|
||
// }
|
||
// if storeSku.EbaiSyncStatus&(model.SyncFlagSaleMask|model.SyncFlagNewMask) != 0 {
|
||
// params["status"] = jxSkuStatus2Ebai(jxutils.MergeSkuStatus(storeSku.SkuStatus, storeSku.Status))
|
||
// }
|
||
// // todo 饿百如果给的UPC是空要报错,但如果我要删除UPC怎么弄?
|
||
// // if storeSku.Upc != "" {
|
||
// // params["upc"] = storeSku.Upc
|
||
// // }
|
||
// return params
|
||
// }
|
||
|
||
// // 从饿百同步分类信息到本地
|
||
// // 些函数执行后:
|
||
// // 远程有与本地有的条目会关联(并置标记,下次同步会刷新远程)
|
||
// // 远程没有本地有的条目会标记新增
|
||
// // 远程有本地没有的条目不做处理
|
||
// func (p *PurchaseHandler) SyncLocalStoreCategory(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||
// globals.SugarLogger.Debugf("ebai SyncLocalStoreCategory storeID:%d, userName:%s", storeID, userName)
|
||
|
||
// sql := `
|
||
// SELECT t2.*, t1.id cat_id, t1.name, t1.parent_id, t1.level, t1.type, t1.seq
|
||
// FROM sku_category t1
|
||
// LEFT JOIN store_sku_category_map t2 ON t1.id = t2.category_id AND t2.store_id = ? AND (t2.deleted_at = ?)
|
||
// WHERE t1.deleted_at = ?
|
||
// ORDER BY t1.level
|
||
// `
|
||
// var catList []*tStoreCatInfo
|
||
// if err = dao.GetRows(db, &catList, sql, storeID, utils.DefaultTimeValue, utils.DefaultTimeValue); err == nil {
|
||
// cat1Map := map[string]*tStoreCatInfo{}
|
||
// for _, v := range catList {
|
||
// v.Name = formatCatName(v.Name)
|
||
// if v.Level == 1 {
|
||
// cat1 := cat1Map[v.Name]
|
||
// if cat1 == nil {
|
||
// cat1Map[v.Name] = v
|
||
// cat1Map[utils.Int2Str(v.CatID)] = v
|
||
// v.Children = make(map[string]*tStoreCatInfo)
|
||
// }
|
||
// } else {
|
||
// cat1 := cat1Map[utils.Int2Str(v.ParentID)]
|
||
// if cat1 == nil {
|
||
// panic(fmt.Sprintf("can not find category, id:%d", v.ParentID))
|
||
// }
|
||
// cat1.Children[v.Name] = v
|
||
// }
|
||
// v.EbaiSyncStatus |= model.SyncFlagNewMask
|
||
// }
|
||
// result, err2 := api.EbaiAPI.ShopCategoryGet(utils.Int2Str(storeID))
|
||
// if err = err2; err == nil {
|
||
// dao.Begin(db)
|
||
// defer func() {
|
||
// dao.Rollback(db)
|
||
// }()
|
||
// // globals.SugarLogger.Debug(utils.Format4Output(cat1Map, false))
|
||
// if err = p.processLocalCatByRemote(db, storeID, cat1Map, result, userName); err == nil {
|
||
// err = p.updateLocalCatAsNew(db, cat1Map, userName)
|
||
// }
|
||
// if err == nil {
|
||
// dao.Commit(db)
|
||
// }
|
||
// }
|
||
// }
|
||
// return err
|
||
// }
|
||
|
||
// // 从本地同步分类信息到饿百
|
||
// // 测试过程中出现过,父分类创建成功后马上创建子分类会报没有父分类错
|
||
// func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync bool) (hint string, err error) {
|
||
// userName := ctx.GetUserName()
|
||
// globals.SugarLogger.Debugf("ebai SyncStoreCategory storeID:%d, userName:%s", storeID, userName)
|
||
|
||
// db := dao.GetDB()
|
||
// rootTask := tasksch.NewSeqTask("ebai SyncStoreCategory", ctx,
|
||
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||
// level := step + 1
|
||
// sql := `
|
||
// SELECT t2.*, t1.name, t1.parent_id, t1.level, t1.type, t1.seq, t2p.ebai_id parent_ebai_id
|
||
// FROM sku_category t1
|
||
// LEFT JOIN sku_category t1p ON t1.parent_id = t1p.id
|
||
// JOIN store_sku_category_map t2 ON t1.id = t2.category_id AND t2.store_id = ? AND t2.ebai_sync_status <> 0
|
||
// LEFT JOIN store_sku_category_map t2p ON t1p.id = t2p.category_id AND t2p.store_id = ? AND t2p.deleted_at = ?
|
||
// WHERE t1.level = ? AND t1.deleted_at = ?
|
||
// `
|
||
// var catList []*tStoreCatInfo
|
||
// sqlParams := []interface{}{
|
||
// storeID,
|
||
// storeID,
|
||
// utils.DefaultTimeValue,
|
||
// level,
|
||
// utils.DefaultTimeValue,
|
||
// }
|
||
// if err = dao.GetRows(db, &catList, sql, sqlParams...); err == nil {
|
||
// if len(catList) > 0 {
|
||
// strStoreID := utils.Int2Str(storeID)
|
||
// task := tasksch.NewParallelTask("SyncStoreCategory", nil, ctx,
|
||
// func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||
// updateFields := []string{model.FieldEbaiSyncStatus}
|
||
// catInfo := batchItemList[0].(*tStoreCatInfo)
|
||
// // globals.SugarLogger.Debug(utils.Format4Output(catInfo, false))
|
||
// if catInfo.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除
|
||
// if catInfo.EbaiSyncStatus&model.SyncFlagNewMask == 0 && catInfo.EbaiID != 0 {
|
||
// if globals.EnableEbaiStoreWrite {
|
||
// if err = api.EbaiAPI.ShopCategoryDelete(strStoreID, catInfo.EbaiID); ebaiapi.IsErrCategoryNotExist(err) {
|
||
// err = nil
|
||
// }
|
||
// }
|
||
// }
|
||
// } else if catInfo.EbaiSyncStatus&model.SyncFlagNewMask != 0 { // 新增
|
||
// if globals.EnableEbaiStoreWrite {
|
||
// catName := formatCatName(catInfo.Name)
|
||
// catInfo.EbaiID, err = api.EbaiAPI.ShopCategoryCreate(strStoreID, catInfo.ParentEbaiID, catName, jxCatSeq2Ebai(catInfo.Seq))
|
||
// if ebaiapi.IsErrCategoryExist(err) {
|
||
// if catInfo.EbaiID = api.EbaiAPI.GetEbaiCatIDFromName(strStoreID, catName); catInfo.EbaiID > 0 {
|
||
// err = nil
|
||
// }
|
||
// }
|
||
// } else {
|
||
// catInfo.EbaiID = jxutils.GenFakeID()
|
||
// }
|
||
// if err == nil {
|
||
// updateFields = append(updateFields, model.FieldEbaiID)
|
||
// }
|
||
// } else if catInfo.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 { // 修改
|
||
// if globals.EnableEbaiStoreWrite {
|
||
// err = api.EbaiAPI.ShopCategoryUpdate(strStoreID, catInfo.EbaiID, formatCatName(catInfo.Name), jxCatSeq2Ebai(catInfo.Seq))
|
||
// }
|
||
// }
|
||
// if err == nil {
|
||
// db2 := dao.GetDB()
|
||
// catInfo.EbaiSyncStatus = 0
|
||
// _, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...)
|
||
// }
|
||
// return nil, err
|
||
// }, catList)
|
||
// rootTask.AddChild(task).Run()
|
||
// _, err = task.GetResult(0)
|
||
// }
|
||
// }
|
||
// return nil, err
|
||
// }, 2)
|
||
// tasksch.AddChild(parentTask, rootTask).Run()
|
||
// if !isAsync {
|
||
// _, err = rootTask.GetResult(0)
|
||
// }
|
||
// return rootTask.ID, err
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) processLocalCatByRemote(db *dao.DaoDB, storeID int, localCatMap map[string]*tStoreCatInfo, remoteCatList []*ebaiapi.CategoryInfo, userName string) (err error) {
|
||
// if localCatMap == nil || remoteCatList == nil {
|
||
// return nil
|
||
// }
|
||
// for _, v := range remoteCatList {
|
||
// jxCat := localCatMap[v.Name]
|
||
// if jxCat == nil { // 远程有,本地没有,非法类别
|
||
// // globals.SugarLogger.Debug(v.Name)
|
||
// // globals.SugarLogger.Debug(utils.Format4Output(localCatMap, false))
|
||
// } else {
|
||
// if jxCat.EbaiID != v.CategoryID {
|
||
// if jxCat.ID == 0 { // 远程有,本门店没有
|
||
// globals.SugarLogger.Debug(jxCat.CatID)
|
||
// err = dao.AddStoreCategoryMap(db, storeID, jxCat.CatID, model.VendorIDEBAI, utils.Int64ToStr(v.CategoryID), model.SyncFlagModifiedMask, userName)
|
||
// } else { // 远程有,本门店有,但ID信息不一致
|
||
// _, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, &jxCat.StoreSkuCategoryMap, map[string]interface{}{
|
||
// model.FieldEbaiID: v.CategoryID,
|
||
// }, userName, nil, model.FieldEbaiSyncStatus, model.SyncFlagModifiedMask)
|
||
// }
|
||
// } else { // 两边都有,且信息一致
|
||
// }
|
||
// jxCat.EbaiSyncStatus = 0
|
||
// if err = p.processLocalCatByRemote(db, storeID, jxCat.Children, v.Children, userName); err != nil {
|
||
// return err
|
||
// }
|
||
// }
|
||
// if err != nil {
|
||
// return err
|
||
// }
|
||
// }
|
||
// return nil
|
||
// }
|
||
|
||
// func (p *PurchaseHandler) updateLocalCatAsNew(db *dao.DaoDB, localCatMap map[string]*tStoreCatInfo, userName string) (err error) {
|
||
// if localCatMap == nil {
|
||
// return nil
|
||
// }
|
||
// for _, v := range localCatMap {
|
||
// if v.EbaiSyncStatus&model.SyncFlagNewMask != 0 {
|
||
// dao.WrapUpdateULEntity(&v.StoreSkuCategoryMap, userName)
|
||
// if _, err = dao.UpdateEntity(db, &v.StoreSkuCategoryMap); err != nil {
|
||
// return err
|
||
// }
|
||
// }
|
||
// if err = p.updateLocalCatAsNew(db, v.Children, userName); err != nil {
|
||
// return err
|
||
// }
|
||
// }
|
||
// return nil
|
||
// }
|