From 92ecba727d8d3aa98378ee5485fc388d178d7e1e Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Dec 2019 14:55:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0SyncSkus=E5=9F=BA=E6=9C=AC=E8=83=BD?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sku.go | 17 +- business/jxstore/cms/sync2.go | 95 +++++++++- business/model/dao/sku.go | 106 +++++++++-- business/model/dao/sku_test.go | 16 ++ business/model/dao/store_sku.go | 17 +- business/partner/partner.go | 6 +- business/partner/purchase/jd/sku.go | 159 +--------------- business/partner/purchase/jd/sku2.go | 224 +++++++++++++++++++++++ business/partner/purchase/jd/sku_test.go | 2 +- business/partner/purchase/jx/sku.go | 14 +- controllers/cms_sku.go | 3 +- 11 files changed, 465 insertions(+), 194 deletions(-) create mode 100644 business/model/dao/sku_test.go create mode 100644 business/partner/purchase/jd/sku2.go diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index a10d73cef..9c18dbcea 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -677,6 +677,10 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s dao.Rollback(db) return nil, err } + if err = OnCreateThing(ctx, db, int64(sku.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return nil, err + } } for _, placeCode := range skuNameExt.Places { placeBind := &model.SkuNamePlaceBind{} @@ -880,6 +884,10 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int if err = err2; err == nil { for _, v := range skuList { sku := &v.Sku + if err = OnDeleteThing(ctx, db, int64(v.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return 0, err + } if _, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldStatus: model.SkuStatusDeleted, @@ -887,11 +895,6 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int dao.Rollback(db) return 0, err } - - if err = OnDeleteThing(ctx, db, int64(v.ID), model.ThingTypeSku); err != nil { - dao.Rollback(db) - return 0, err - } } } @@ -1190,9 +1193,9 @@ func DeleteSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName return num, err } -func GetVendorSku(ctx *jxcontext.Context, vendorID int, vendorSkuID string) (skuNameInfo *model.SkuNameExt, err error) { +func GetVendorSku(ctx *jxcontext.Context, vendorID int, vendorOrgCode, vendorSkuID string) (skuNameInfo *model.SkuNameExt, err error) { if handler := CurVendorSync.GetMultiStoreHandler(vendorID); handler != nil { - return handler.ReadSku(vendorSkuID) + return handler.ReadSku(ctx, vendorOrgCode, vendorSkuID) } return nil, ErrCanNotFindVendor } diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 5d3b13ad8..f84310780 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -5,6 +5,8 @@ import ( "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/utils/errlist" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" @@ -40,7 +42,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs globals.SugarLogger.Debugf("SyncCategories catIDs:%v", catIDs) db := dao.GetDB() catList, err := dao.GetSkuCategoryWithVendor(db, nil, nil, -1, catIDs, true) - if err == nil { + if err == nil && len(catList) > 0 { // todo 按vendorID orgCode合并操作 task := tasksch.NewParallelTask(fmt.Sprintf("同步分类:%v", catIDs), nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { @@ -60,7 +62,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs err = fmt.Errorf("平台:%d不合法", catVendorInfo.VendorID) } if err = OnThingSync(ctx, dao.GetDB(), SkuCategoryVendor2ThingMap(catVendorInfo), err); err == nil { - retVal = []int{catVendorInfo.ID} + retVal = []int{1} } return retVal, err }, catList) @@ -77,6 +79,49 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs return hint, err } +func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, isAsync bool) (hint string, err error) { + globals.SugarLogger.Debugf("SyncSkus nameIDs:%v, skuIDs:%v", nameIDs, skuIDs) + db := dao.GetDB() + skuList, err := dao.GetSkusWithVendor(db, nil, nil, nameIDs, skuIDs, true) + if err == nil && len(skuList) > 0 { + // todo 按vendorID orgCode合并操作 + task := tasksch.NewParallelTask(fmt.Sprintf("同步商品:%v,%v", nameIDs, skuIDs), nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + skuVendorInfo := batchItemList[0].(*dao.StoreSkuSyncInfo) + skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus) + if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { + if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除 + if !dao.IsVendorThingIDEmpty(skuVendorInfo.VendorSkuID) && + model.IsSyncStatusNeedDelete(skuVendorInfo.SkuSyncStatus) { + err = multiStoresHandler.DeleteSku2(ctx, skuVendorInfo) + } + } else if model.IsSyncStatusNew(skuVendorInfo.SkuSyncStatus) { // 新增 + err = multiStoresHandler.CreateSku2(ctx, skuVendorInfo) + } else if model.IsSyncStatusUpdate(skuVendorInfo.SkuSyncStatus) { // 修改 + err = multiStoresHandler.UpdateSku2(ctx, skuVendorInfo) + } + } else { + err = fmt.Errorf("平台:%d不合法", skuVendorInfo.VendorID) + } + if err = OnThingSync(ctx, dao.GetDB(), SkuVendor2ThingMap(skuVendorInfo), err); err == nil { + retVal = []int{1} + } + return retVal, err + }, skuList) + tasksch.HandleTask(task, parentTask, len(skuList) > 0).Run() + if isAsync { + hint = task.GetID() + } else { + resultList, err2 := task.GetResult(0) + if err = err2; err == nil { + hint = utils.Int2Str(len(resultList)) + } + } + } + return hint, err +} + func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool) (hint string, err error) { globals.SugarLogger.Debugf("SyncReorderCategories parentCatID:%d", parentCatID) db := dao.GetDB() @@ -108,6 +153,10 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool } func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) { + if thingType == model.ThingTypeSkuName { + return nil + } + errList := errlist.New() for _, v := range getMultiStoreVendorInfoList() { thingMap := &model.ThingMap{ ThingID: thingID, @@ -117,12 +166,17 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy SyncStatus: model.SyncFlagNewMask, } dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName()) - err = dao.CreateEntity(db, thingMap) + errList.AddErr(dao.CreateEntity(db, thingMap)) } + // return errList.GetErrListAsOne() return nil } func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) { + if thingType == model.ThingTypeSkuName { + return nil + } + errList := errlist.New() for _, v := range getMultiStoreVendorInfoList() { thingMap := &model.ThingMap{ ThingID: thingID, @@ -131,16 +185,24 @@ func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy VendorOrgCode: v.OrgCode, } thingMap.DeletedAt = utils.DefaultTimeValue - if err = dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err == nil { + if err2 := dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err2 == nil { thingMap.SyncStatus |= model.SyncFlagModifiedMask thingMap.LastOperator = ctx.GetUserName() - _, err = dao.UpdateEntity(db, thingMap) + _, err2 = dao.UpdateEntity(db, thingMap) + errList.AddErr(err2) + } else if !dao.IsNoRowsError(err2) { + errList.AddErr(err2) } } + // return errList.GetErrListAsOne() return nil } func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) { + if thingType == model.ThingTypeSkuName { + return nil + } + errList := errlist.New() for _, v := range getMultiStoreVendorInfoList() { thingMap := &model.ThingMap{ ThingID: thingID, @@ -149,7 +211,7 @@ func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy VendorOrgCode: v.OrgCode, } thingMap.DeletedAt = utils.DefaultTimeValue - if err = dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err == nil { + if err2 := dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err2 == nil { if model.IsSyncStatusNew(thingMap.SyncStatus) { thingMap.SyncStatus = 0 thingMap.DeletedAt = time.Now() @@ -157,9 +219,13 @@ func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy thingMap.SyncStatus |= model.SyncFlagDeletedMask } thingMap.LastOperator = ctx.GetUserName() - _, err = dao.UpdateEntity(db, thingMap) + _, err2 = dao.UpdateEntity(db, thingMap) + errList.AddErr(err2) + } else if !dao.IsNoRowsError(err2) { + errList.AddErr(err2) } } + // return errList.GetErrListAsOne() return nil } @@ -177,7 +243,22 @@ func SkuCategoryVendor2ThingMap(cat *dao.SkuStoreCatInfo) (thingMap *model.Thing return thingMap } +func SkuVendor2ThingMap(sku *dao.StoreSkuSyncInfo) (thingMap *model.ThingMap) { + thingMap = &model.ThingMap{ + ThingID: int64(sku.SkuID), + ThingType: model.ThingTypeSku, + VendorID: sku.VendorID, + VendorOrgCode: sku.VendorOrgCode, + + SyncStatus: sku.SkuSyncStatus, + VendorThingID: sku.VendorSkuID, + } + thingMap.ID = sku.BindID // 一定要赋值 + return thingMap +} + func OnThingSync(ctx *jxcontext.Context, db *dao.DaoDB, thingMap *model.ThingMap, syncErr error) (err error) { + globals.SugarLogger.Debugf("OnThingSync thingMap:%s", utils.Format4Output(thingMap, true)) if syncErr != nil { err = syncErr thingMap.Remark = utils.LimitUTF8StringLen(err.Error(), 255) diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 511a06f48..2bc18b0c3 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -8,18 +8,10 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -// type SkuStoreCatInfo struct { -// model.SkuCategory - -// VendorID int `orm:"column(vendor_id)" json:"vendorID"` -// VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 - -// MapID int `orm:"column(map_id)" json:"mapID"` -// VendorCatID string `orm:"size(32);column(vendor_cat_id)" json:"vendorCatID"` -// SyncStatus int8 `orm:"default(2)"` - -// VendorParentCatID string `orm:"size(32);column(vendor_parent_cat_id)" json:"vendorParentCatID"` -// } +type tStoreSkuSyncInfo2 struct { + StoreSkuSyncInfo + VendorPlaceCode string +} func GetSellCities(db *DaoDB, nameID int, vendorID int) (cities []*model.Place, err error) { cities = []*model.Place{} @@ -157,6 +149,7 @@ func SetSkuSyncStatus(db *DaoDB, vendorID int, skuIDs []int, syncStatus int) (nu return ExecuteSQL(db, sql, sqlParams...) } +// 多门店平台使用,当前只有京东 func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuStoreCatInfo, err error) { sql := ` SELECT @@ -180,7 +173,7 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ? LEFT JOIN sku_category t1p ON t1p.id = t1.parent_id LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ? - AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code + AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code WHERE 1 = 1 ` sqlParams := []interface{}{ @@ -215,3 +208,90 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, err = GetRows(db, &catList, sql, sqlParams...) return catList, err } + +// 多门店平台使用,当前只有京东 +func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, mustDirty bool) (skuList []*StoreSkuSyncInfo, err error) { + sql := ` + SELECT + t1m.vendor_id, t1m.vendor_org_code, + + t1m.id bind_id, + t1.*, + t1.id sku_id, + t1m.vendor_thing_id vendor_sku_id, + t1m.sync_status sku_sync_status, + + t2.price, + t2.price unit_price, + t2.prefix, + t2.name, + t2.unit, + t2.upc, + t2.is_global, + t2.status name_status, + t2.img, + t2.img2, + t2.desc_img, + + t5.jd_code vendor_place_code, + + t3.jd_category_id vendor_vendor_cat_id, + + t3m.sync_status cat_sync_status, + t3m.vendor_thing_id vendor_cat_id + + FROM sku t1 + LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ? + JOIN sku_name t2 ON t2.id = t1.name_id + LEFT JOIN sku_category t3 ON t3.id = t2.category_id + LEFT JOIN thing_map t3m ON t3m.thing_id = t3.id AND t3m.thing_type = ? AND t3m.deleted_at = ? + AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code + LEFT JOIN sku_name_place_bind t4 ON t2.is_global = 0 AND t4.name_id = t1.name_id + LEFT JOIN place t5 ON t5.code = t4.place_code + WHERE 1 = 1 + ` + sqlParams := []interface{}{ + model.ThingTypeSku, + utils.DefaultTimeValue, + model.ThingTypeCategory, + utils.DefaultTimeValue, + } + if mustDirty { + sql += " AND t1m.sync_status <> 0" + } else { + sql += " AND t1.deleted_at = ?" + sqlParams = append(sqlParams, utils.DefaultTimeValue) + } + if len(vendorIDs) > 0 { + sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" + sqlParams = append(sqlParams, vendorIDs) + } + if len(appOrgCodes) > 0 { + sql += " AND t1m.vendor_org_code IN (" + GenQuestionMarks(len(appOrgCodes)) + ")" + sqlParams = append(sqlParams, appOrgCodes) + } + if len(nameIDs) > 0 { + sql += " AND t1.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + if len(skuIDs) > 0 { + sql += " AND t1.id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + sql += " ORDER BY t1.seq" + + var list []*tStoreSkuSyncInfo2 + if err = GetRows(db, &list, sql, sqlParams...); err == nil { + skuMap := make(map[int]*StoreSkuSyncInfo) + for _, v := range list { + if skuMap[v.SkuID] == nil { + skuMap[v.SkuID] = &v.StoreSkuSyncInfo + skuList = append(skuList, &v.StoreSkuSyncInfo) + } + if !IsVendorThingIDEmpty(v.VendorPlaceCode) { + skuMap[v.SkuID].SellCities = append(skuMap[v.SkuID].SellCities, v.VendorPlaceCode) + } + } + } + return skuList, err +} diff --git a/business/model/dao/sku_test.go b/business/model/dao/sku_test.go new file mode 100644 index 000000000..50e7e45e0 --- /dev/null +++ b/business/model/dao/sku_test.go @@ -0,0 +1,16 @@ +package dao + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals" +) + +func TestGetSkusWithVendor(t *testing.T) { + skuList, err := GetSkusWithVendor(GetDB(), nil, nil, []int{17368}, nil, true) + if err != nil { + t.Fatal(err) + } + globals.SugarLogger.Debug(utils.Format4Output(skuList, false)) +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 202ded2e0..532bf2b2e 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -40,6 +40,9 @@ type SkuStoreCatInfo struct { } type StoreSkuSyncInfo struct { + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + // 平台无关的store sku信息 BindID int `orm:"column(bind_id)"` // 换名的原因是与Sku.ID同名区别 StoreID int `orm:"column(store_id)"` @@ -57,12 +60,15 @@ type StoreSkuSyncInfo struct { model.Sku // sku_name - Prefix string - NameID int `orm:"column(name_id)"` - VendorNameID string `orm:"column(vendor_name_id)"` + Prefix string + // NameID int `orm:"column(name_id)"` + VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 Name string Unit string Upc string + IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 + NameStatus int + SellCities []string // 平台相关的图片信息 Img string @@ -71,11 +77,6 @@ type StoreSkuSyncInfo struct { VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) - // 饿百也只需要给出叶子结点了 - // https://open-be.ele.me/dev/notice?id=275 - // VendorVendorCatID2 int64 `orm:"column(vendor_vendor_cat_id2)"` // 平台商品分类上一级 - // VendorVendorCatID3 int64 `orm:"column(vendor_vendor_cat_id3)"` // 平台商品分类再上一级 - // sku的商家分类信息 SkuCatSyncStatus int8 SkuVendorCatID string `orm:"column(sku_vendor_cat_id)"` diff --git a/business/partner/partner.go b/business/partner/partner.go index 2786ee1d7..524c5b93c 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -168,10 +168,14 @@ type IMultipleStoresHandler interface { // sku CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) - ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) + ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) + CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) + UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) + DeleteSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) + // RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*SkuNameInfo, err error) diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 549d0d4af..3f39b0ed9 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -15,14 +15,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" - "github.com/astaxie/beego" -) - -const ( - DefBrandID = 35247 - - DefJdCategoryID = 20362 - DefJdCategoryID4Jxgy = 22410 // 其他国产水果 ) type tSkuInfoExt struct { @@ -39,13 +31,6 @@ var ( } ) -func getDefJdCategoryID() int { - if beego.BConfig.RunMode == "jxgy" { - return DefJdCategoryID4Jxgy - } - return DefJdCategoryID -} - func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { var jdPid int64 if cat.ParentID != 0 { @@ -68,46 +53,6 @@ func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, return err } -func jdCat2Jx(jdCat *jdapi.CategoryInfo) (jxCat *partner.BareCategoryInfo) { - return &partner.BareCategoryInfo{ - VendorCatID: utils.Int64ToStr(jdCat.Id), - Level: jdCat.Level, - Name: jdCat.Name, - Seq: jdCat.Sort, - } -} - -func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) { - result, err := getAPI(vendorOrgCode).QueryCategoriesByOrgCode() - if err == nil { - catMap := make(map[int64]*partner.BareCategoryInfo) - level := 1 - for { - processedCount := 0 - for _, jdCat := range result { - if jdCat.Level == level { - processedCount++ - jxCat := jdCat2Jx(jdCat) - if level == 1 { - cats = append(cats, jxCat) - } else { - parentCat := catMap[jdCat.ParentId] - if parentCat != nil { - parentCat.Children = append(parentCat.Children, jxCat) - } - } - catMap[jdCat.Id] = jxCat - } - } - if processedCount == 0 { - break - } - level++ - } - } - return cats, err -} - func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { if globals.EnableJdStoreWrite { return getAPI("").UpdateShopCategory(cat.JdID, cat.Name) @@ -149,41 +94,6 @@ func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, user return err } -func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { - if globals.EnableJdStoreWrite { - result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.ParentVendorCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) - if err = err2; err == nil { - if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { - cat.VendorCatID = utils.Int64ToStr(jdID) - } - } - } else { - cat.VendorCatID = utils.Int64ToStr(jxutils.GenFakeID()) - } - return err -} - -func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { - if globals.EnableJdStoreWrite { - err = getAPI(cat.VendorOrgCode).UpdateShopCategory(utils.Str2Int64(cat.VendorCatID), cat.Name) - } - return err -} - -func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { - if globals.EnableJdStoreWrite { - err = getAPI(cat.VendorOrgCode).DelShopCategory(utils.Str2Int64(cat.VendorCatID)) - } - return err -} - -func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) { - if globals.EnableJdStoreWrite { - err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64(vendorParentCatID), utils.StringSlice2Int64(vendorCatIDList)) - } - return err -} - func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) { var skuInfoExt tSkuInfoExt err = dao.GetRow(nil, &skuInfoExt, ` @@ -266,15 +176,16 @@ func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName stri }) } -func (p *PurchaseHandler) ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { +func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { jdSkuID := utils.Str2Int64(vendorSkuID) - skuList, _, err := getAPI("").QuerySkuInfos(&jdapi.QuerySkuParam{ + a := getAPI(vendorOrgCode) + skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{ SkuID: jdSkuID, }) if err == nil { if len(skuList) >= 1 { skuNameExt = &model.SkuNameExt{} - if imgList, err2 := getAPI("").QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{ + if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{ SkuIDs: []int64{jdSkuID}, }); err2 == nil && len(imgList) > 0 { skuNameExt.Img = imgList[0].SourceImgURL @@ -577,68 +488,6 @@ func composeSkuSpec(specQuality float32, specUnit, unit string) string { return value } -func jdStatus2jxStatus(jdStatus int) (jxStatus int) { - switch jdStatus { - case jdapi.SkuFixedStatusOnline: - jxStatus = model.SkuStatusNormal - case jdapi.SkuFixedStatusOffline: - jxStatus = model.SkuStatusDontSale - case jdapi.SkuFixedStatusDeleted: - jxStatus = model.SkuStatusDeleted - } - return jxStatus -} - -func jxStatus2jdStatus(jxStatus int) (jdStatus int) { - switch jxStatus { - case model.SkuStatusNormal: - jdStatus = jdapi.SkuFixedStatusOnline - case model.SkuStatusDontSale: - jdStatus = jdapi.SkuFixedStatusOffline - case model.SkuStatusDeleted: - jdStatus = jdapi.SkuFixedStatusDeleted - } - return jdStatus -} - -func (p *PurchaseHandler) getVendorCategories(level int, pid int64) (vendorCats []*model.SkuVendorCategory, err error) { - cats, err := getAPI("").QueryChildCategoriesForOP(pid) - if err != nil { - return nil, err - } - for _, v := range cats { - if v.Status == 1 { - cat := &model.SkuVendorCategory{ - VendorID: model.VendorIDJD, - Name: v.Name, - Level: level, - VendorCategoryID: utils.Int64ToStr(v.Id), - } - if level > 1 { - cat.ParentID = utils.Int64ToStr(v.ParentId) - if level == 3 { - cat.IsLeaf = 1 - } - } - vendorCats = append(vendorCats, cat) - if level < 3 { - childVendorCats, err2 := p.getVendorCategories(level+1, v.Id) - if err2 == nil && len(childVendorCats) > 0 { - vendorCats = append(vendorCats, childVendorCats...) - } else { - cat.IsLeaf = 1 - } - } - } - } - return vendorCats, nil -} - -func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) { - vendorCats, err = p.getVendorCategories(1, 0) - return vendorCats, err -} - func (p *PurchaseHandler) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*partner.SkuNameInfo, err error) { param := &jdapi.QuerySkuParam{ SkuID: utils.Str2Int64WithDefault(vendorSkuID, 0), diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go new file mode 100644 index 000000000..9e85466eb --- /dev/null +++ b/business/partner/purchase/jd/sku2.go @@ -0,0 +1,224 @@ +package jd + +import ( + "fmt" + + "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" + "github.com/astaxie/beego" +) + +const ( + DefBrandID = 35247 + + DefJdCategoryID = 20362 + DefJdCategoryID4Jxgy = 22410 // 其他国产水果 +) + +func getDefJdCategoryID() int { + if beego.BConfig.RunMode == "jxgy" { + return DefJdCategoryID4Jxgy + } + return DefJdCategoryID +} + +func jdCat2Jx(jdCat *jdapi.CategoryInfo) (jxCat *partner.BareCategoryInfo) { + return &partner.BareCategoryInfo{ + VendorCatID: utils.Int64ToStr(jdCat.Id), + Level: jdCat.Level, + Name: jdCat.Name, + Seq: jdCat.Sort, + } +} + +func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) { + result, err := getAPI(vendorOrgCode).QueryCategoriesByOrgCode() + if err == nil { + catMap := make(map[int64]*partner.BareCategoryInfo) + level := 1 + for { + processedCount := 0 + for _, jdCat := range result { + if jdCat.Level == level { + processedCount++ + jxCat := jdCat2Jx(jdCat) + if level == 1 { + cats = append(cats, jxCat) + } else { + parentCat := catMap[jdCat.ParentId] + if parentCat != nil { + parentCat.Children = append(parentCat.Children, jxCat) + } + } + catMap[jdCat.Id] = jxCat + } + } + if processedCount == 0 { + break + } + level++ + } + } + return cats, err +} + +func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdStoreWrite { + result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.ParentVendorCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) + if err = err2; err == nil { + if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { + cat.VendorCatID = utils.Int64ToStr(jdID) + } + } + } else { + cat.VendorCatID = utils.Int64ToStr(jxutils.GenFakeID()) + } + return err +} + +func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI(cat.VendorOrgCode).UpdateShopCategory(utils.Str2Int64(cat.VendorCatID), cat.Name) + } + return err +} + +func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI(cat.VendorOrgCode).DelShopCategory(utils.Str2Int64(cat.VendorCatID)) + } + return err +} + +func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64(vendorParentCatID), utils.StringSlice2Int64(vendorCatIDList)) + } + return err +} + +func (p *PurchaseHandler) getVendorCategories(level int, pid int64) (vendorCats []*model.SkuVendorCategory, err error) { + cats, err := getAPI("").QueryChildCategoriesForOP(pid) + if err != nil { + return nil, err + } + for _, v := range cats { + if v.Status == 1 { + cat := &model.SkuVendorCategory{ + VendorID: model.VendorIDJD, + Name: v.Name, + Level: level, + VendorCategoryID: utils.Int64ToStr(v.Id), + } + if level > 1 { + cat.ParentID = utils.Int64ToStr(v.ParentId) + if level == 3 { + cat.IsLeaf = 1 + } + } + vendorCats = append(vendorCats, cat) + if level < 3 { + childVendorCats, err2 := p.getVendorCategories(level+1, v.Id) + if err2 == nil && len(childVendorCats) > 0 { + vendorCats = append(vendorCats, childVendorCats...) + } else { + cat.IsLeaf = 1 + } + } + } + } + return vendorCats, nil +} + +func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) { + vendorCats, err = p.getVendorCategories(1, 0) + return vendorCats, err +} + +func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jdapi.OpSkuParam) { + param = &jdapi.OpSkuParam{ + TraceID: ctx.GetTrackInfo(), + OutSkuID: utils.Int2Str(sku.SkuID), + ShopCategories: []int64{utils.Str2Int64(sku.VendorCatID)}, + CategoryID: sku.VendorVendorCatID, + BrandID: DefBrandID, + SkuName: utils.LimitUTF8StringLen(sku.SkuName, jdapi.MaxSkuNameCharCount), + SkuPrice: int(sku.Price), + Weight: float64(jxutils.IntWeight2Float(sku.Weight)), + FixedStatus: jxStatus2jdStatus(sku.MergedStatus), + IsSale: jdapi.IsSaleNo, // todo ? + + Upc: sku.Upc, + Images: jxutils.BatchString2Slice(sku.Img, sku.Img2), + } + if param.CategoryID == 0 { + param.CategoryID = int64(getDefJdCategoryID()) + } + if sku.IsGlobal == 0 && len(sku.SellCities) > 0 { + param.SellCities = utils.StringSlice2Int64(sku.SellCities) + } + if sku.DescImg != "" { + param.ProductDesc = fmt.Sprintf(`一张图片`, sku.DescImg) + } + return param +} + +func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + param := skuInfo2Param(ctx, sku) + if globals.EnableJdStoreWrite { + sku.VendorSkuID, err = getAPI(sku.VendorOrgCode).AddSku2(param) + } else { + sku.VendorSkuID = utils.Int64ToStr(jxutils.GenFakeID()) + } + return err +} + +func (p *PurchaseHandler) UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + param := skuInfo2Param(ctx, sku) + if globals.EnableJdStoreWrite { + _, err = getAPI(sku.VendorOrgCode).UpdateSku2(param) + } + return err +} + +func (p *PurchaseHandler) DeleteSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + param := &jdapi.OpSkuParam{ + TraceID: ctx.GetTrackInfo(), + OutSkuID: utils.Int2Str(sku.SkuID), + FixedStatus: jdapi.SkuFixedStatusDeleted, + } + if globals.EnableJdStoreWrite { + _, err = getAPI(sku.VendorOrgCode).UpdateSku2(param) + } + return err +} + +func jdStatus2jxStatus(jdStatus int) (jxStatus int) { + switch jdStatus { + case jdapi.SkuFixedStatusOnline: + jxStatus = model.SkuStatusNormal + case jdapi.SkuFixedStatusOffline: + jxStatus = model.SkuStatusDontSale + case jdapi.SkuFixedStatusDeleted: + jxStatus = model.SkuStatusDeleted + } + return jxStatus +} + +func jxStatus2jdStatus(jxStatus int) (jdStatus int) { + switch jxStatus { + case model.SkuStatusNormal: + jdStatus = jdapi.SkuFixedStatusOnline + case model.SkuStatusDontSale: + jdStatus = jdapi.SkuFixedStatusOffline + case model.SkuStatusDeleted: + jdStatus = jdapi.SkuFixedStatusDeleted + } + return jdStatus +} diff --git a/business/partner/purchase/jd/sku_test.go b/business/partner/purchase/jd/sku_test.go index bbb28661b..d05e7f67d 100644 --- a/business/partner/purchase/jd/sku_test.go +++ b/business/partner/purchase/jd/sku_test.go @@ -46,7 +46,7 @@ func TestGetAllCategories(t *testing.T) { } func TestReadSku(t *testing.T) { - skuName, err := CurPurchaseHandler.ReadSku("2005582952") + skuName, err := CurPurchaseHandler.ReadSku(jxcontext.AdminCtx, "", "2005582952") t.Log(utils.Format4Output(skuName, false)) if err != nil { t.Fatal(err.Error()) diff --git a/business/partner/purchase/jx/sku.go b/business/partner/purchase/jx/sku.go index bc4144fbb..cb8fcbdad 100644 --- a/business/partner/purchase/jx/sku.go +++ b/business/partner/purchase/jx/sku.go @@ -50,7 +50,7 @@ func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName stri return err } -func (p *PurchaseHandler) ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { +func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { return skuNameExt, err } @@ -62,6 +62,18 @@ func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName stri return err } +func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + return err +} + +func (p *PurchaseHandler) UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + return err +} + +func (p *PurchaseHandler) DeleteSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + return err +} + func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { return hint, err } diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index 164d6df80..03d1d09c4 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -296,12 +296,13 @@ func (c *SkuController) DeleteSkuNamePlace() { // @Param token header string true "认证token" // @Param vendorSkuID query string true "sku ID" // @Param vendorID query int true "门店所属的厂商ID" +// @Param vendorOrgCode query string true "厂商内组织代码" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetVendorSku [get] func (c *SkuController) GetVendorSku() { c.callGetVendorSku(func(params *tSkuGetVendorSkuParams) (retVal interface{}, errCode string, err error) { - retVal, err = cms.GetVendorSku(params.Ctx, params.VendorID, params.VendorSkuID) + retVal, err = cms.GetVendorSku(params.Ctx, params.VendorID, params.VendorOrgCode, params.VendorSkuID) return retVal, "", err }) }