新SyncSkus基本能工作

This commit is contained in:
gazebo
2019-12-06 14:55:16 +08:00
parent 6806ab202d
commit 92ecba727d
11 changed files with 465 additions and 194 deletions

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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))
}

View File

@@ -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)"`

View File

@@ -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)

View File

@@ -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),

View File

@@ -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(`<img src="%s" alt="一张图片" />`, 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
}

View File

@@ -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())

View File

@@ -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
}

View File

@@ -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
})
}