Merge remote-tracking branch 'origin/mark' into su

This commit is contained in:
苏尹岚
2019-12-03 11:30:40 +08:00
42 changed files with 667 additions and 2419 deletions

View File

@@ -299,34 +299,34 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
err = func() (err error) {
if model.IsSyncStatusDelete(act.SyncStatus) {
canceledList, err2 := cancelSkuAct(ctx, nil, vendorActInfoMap)
updateItems = append(updateItems, partner.ActStoreSku2Update(canceledList, model.SyncFlagModifiedMask)...)
updateItems = append(updateItems, partner.ActStoreSku2Update(ctx, canceledList, model.SyncFlagModifiedMask)...)
if err = err2; err == nil {
updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask))
updateItems = append(updateItems, partner.Act2Update(ctx, act, model.SyncFlagModifiedMask))
}
} else if model.IsSyncStatusNew(act.SyncStatus) {
createdList, err2 := createSkuAct(ctx, nil, act, actStoreSkuList4Create)
updateItems = append(updateItems, partner.ActStoreSku2Update(createdList, model.SyncFlagNewMask)...)
updateItems = append(updateItems, partner.ActStoreSku2Update(ctx, createdList, model.SyncFlagNewMask)...)
if err = err2; err == nil {
updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagNewMask))
updateItems = append(updateItems, partner.Act2Update(ctx, act, model.SyncFlagNewMask))
}
} else if model.IsSyncStatusUpdate(act.SyncStatus) {
// globals.SugarLogger.Debug(utils.Format4Output(updateItems, false))
if len(actStoreSkuList4Create) > 0 {
addedList, err2 := addSkuActSkus(ctx, nil, act, actStoreSkuList4Create, vendorActIDMap)
updateItems = append(updateItems, partner.ActStoreSku2Update(addedList, model.SyncFlagNewMask)...)
updateItems = append(updateItems, partner.ActStoreSku2Update(ctx, addedList, model.SyncFlagNewMask)...)
if err = err2; err != nil {
return err
}
}
if len(deleteActInfoMap) > 0 {
deletedList, err2 := deleteSkuActSkus(ctx, nil, deleteActInfoMap, vendorActInfoMap)
updateItems = append(updateItems, partner.ActStoreSku2Update(deletedList, model.SyncFlagDeletedMask)...)
updateItems = append(updateItems, partner.ActStoreSku2Update(ctx, deletedList, model.SyncFlagDeletedMask)...)
if err = err2; err != nil {
return err
}
}
if err == nil {
updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask))
updateItems = append(updateItems, partner.Act2Update(ctx, act, model.SyncFlagModifiedMask))
}
}
return err

View File

@@ -1,555 +0,0 @@
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
// }