去除老的sku与category相关多门店平台接口

This commit is contained in:
gazebo
2019-12-17 16:51:45 +08:00
parent 64c7aec3c3
commit b6e8c33012
4 changed files with 686 additions and 699 deletions

View File

@@ -12,7 +12,6 @@ import (
"git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/refutil"
) )
type LoopStoreMapInfo struct { type LoopStoreMapInfo struct {
@@ -47,36 +46,36 @@ var (
ErrEntityNotExist = errors.New("找不到相应实体") ErrEntityNotExist = errors.New("找不到相应实体")
) )
func (p *MultiStoreHandlerWrapper) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { // func (p *MultiStoreHandlerWrapper) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
if jxutils.IsEmptyID(cat.JdID) { // if jxutils.IsEmptyID(cat.JdID) {
return nil // return nil
} // }
return p.IMultipleStoresHandler.DeleteCategory(db, cat, userName) // return p.IMultipleStoresHandler.DeleteCategory(db, cat, userName)
} // }
func (p *MultiStoreHandlerWrapper) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { // func (p *MultiStoreHandlerWrapper) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
if jxutils.IsEmptyID(cat.JdID) { // if jxutils.IsEmptyID(cat.JdID) {
globals.SugarLogger.Warnf("UpdateCategory fakeid cat:%s should not get here", utils.Format4Output(cat, true)) // globals.SugarLogger.Warnf("UpdateCategory fakeid cat:%s should not get here", utils.Format4Output(cat, true))
return nil // return nil
} // }
return p.IMultipleStoresHandler.UpdateCategory(db, cat, userName) // return p.IMultipleStoresHandler.UpdateCategory(db, cat, userName)
} // }
func (p *MultiStoreHandlerWrapper) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // func (p *MultiStoreHandlerWrapper) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
globals.SugarLogger.Debugf("wrapper DeleteSku, sku:%s", utils.Format4Output(sku, false)) // globals.SugarLogger.Debugf("wrapper DeleteSku, sku:%s", utils.Format4Output(sku, false))
if jxutils.IsEmptyID(sku.JdID) { // if jxutils.IsEmptyID(sku.JdID) {
return nil // return nil
} // }
return p.IMultipleStoresHandler.DeleteSku(db, sku, userName) // return p.IMultipleStoresHandler.DeleteSku(db, sku, userName)
} // }
func (p *MultiStoreHandlerWrapper) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // func (p *MultiStoreHandlerWrapper) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
if jxutils.IsEmptyID(sku.JdID) { // if jxutils.IsEmptyID(sku.JdID) {
globals.SugarLogger.Warnf("UpdateSku fakeid sku:%s should not get here", utils.Format4Output(sku, true)) // globals.SugarLogger.Warnf("UpdateSku fakeid sku:%s should not get here", utils.Format4Output(sku, true))
return nil // return nil
} // }
return p.IMultipleStoresHandler.UpdateSku(db, sku, userName) // return p.IMultipleStoresHandler.UpdateSku(db, sku, userName)
} // }
func (v *VendorSync) GetStoreHandler(vendorID int) partner.IPurchasePlatformHandler { func (v *VendorSync) GetStoreHandler(vendorID int) partner.IPurchasePlatformHandler {
return partner.GetPurchasePlatformFromVendorID(vendorID) return partner.GetPurchasePlatformFromVendorID(vendorID)
@@ -96,95 +95,95 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan
return nil return nil
} }
func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) { // func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) {
multiStoresHandler := v.GetMultiStoreHandler(vendorID) // multiStoresHandler := v.GetMultiStoreHandler(vendorID)
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) // syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorID]), nil, ctx, // task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorID]), nil, ctx,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
cat := batchItemList[0].(*model.SkuCategory) // cat := batchItemList[0].(*model.SkuCategory)
updateFields := []string{syncStatusFieldName} // updateFields := []string{syncStatusFieldName}
syncStatus := refutil.GetObjFieldByName(cat, syncStatusFieldName).(int8) // syncStatus := refutil.GetObjFieldByName(cat, syncStatusFieldName).(int8)
if (syncStatus & model.SyncFlagDeletedMask) != 0 { //删除 // if (syncStatus & model.SyncFlagDeletedMask) != 0 { //删除
if (syncStatus & model.SyncFlagNewMask) == 0 { // if (syncStatus & model.SyncFlagNewMask) == 0 {
err = multiStoresHandler.DeleteCategory(db, cat, userName) // err = multiStoresHandler.DeleteCategory(db, cat, userName)
} // }
} else if (syncStatus & model.SyncFlagNewMask) != 0 { // 新增 // } else if (syncStatus & model.SyncFlagNewMask) != 0 { // 新增
err = multiStoresHandler.CreateCategory(db, cat, userName) // err = multiStoresHandler.CreateCategory(db, cat, userName)
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) // updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()]))
} else if (syncStatus & model.SyncFlagModifiedMask) != 0 { // 修改 // } else if (syncStatus & model.SyncFlagModifiedMask) != 0 { // 修改
err = multiStoresHandler.UpdateCategory(db, cat, userName) // err = multiStoresHandler.UpdateCategory(db, cat, userName)
if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.IntCode() == -3 { // if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.IntCode() == -3 {
err = nil // err = nil
} // }
} // }
if err == nil { // if err == nil {
refutil.SetObjFieldByName(cat, syncStatusFieldName, int8(0)) // refutil.SetObjFieldByName(cat, syncStatusFieldName, int8(0))
_, err = dao.UpdateEntity(db, cat, updateFields...) // _, err = dao.UpdateEntity(db, cat, updateFields...)
} // }
return nil, err // return nil, err
}, cats) // }, cats)
tasksch.HandleTask(task, parentTask, false).Run() // tasksch.HandleTask(task, parentTask, false).Run()
_, err = task.GetResult(0) // _, err = task.GetResult(0)
return err // return err
} // }
func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) {
if !globals.IsUseThingMap { // if !globals.IsUseThingMap {
return v.oldSyncCategory(ctx, db, categoryID, isAsync, userName) // return v.oldSyncCategory(ctx, db, categoryID, isAsync, userName)
} // }
return SyncCategories(ctx, nil, nil, nil, []int{categoryID}, isAsync) return SyncCategories(ctx, nil, nil, nil, []int{categoryID}, isAsync)
} }
func (v *VendorSync) oldSyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { // func (v *VendorSync) oldSyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) {
globals.SugarLogger.Debug("SyncCategory") // globals.SugarLogger.Debug("SyncCategory")
hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步分类信息:%d", categoryID), isAsync, false, // hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步分类信息:%d", categoryID), isAsync, false,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) // vendorInfo := batchItemList[0].(*MultiStoreVendorInfo)
var cats []*model.SkuCategory // var cats []*model.SkuCategory
cond := make(map[string]interface{}) // cond := make(map[string]interface{})
if categoryID > 0 { // if categoryID > 0 {
cond[model.FieldID] = categoryID // cond[model.FieldID] = categoryID
} else { // } else {
cond[model.FieldLevel] = 1 // cond[model.FieldLevel] = 1
} // }
err := dao.GetEntitiesByKV(db, &cats, cond, true) // err := dao.GetEntitiesByKV(db, &cats, cond, true)
if err == nil { // if err == nil {
err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) // err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName)
} // }
if err != nil || categoryID > 0 { // if err != nil || categoryID > 0 {
return nil, err // return nil, err
} // }
cond[model.FieldLevel] = 2 // cond[model.FieldLevel] = 2
err = dao.GetEntitiesByKV(db, &cats, cond, true) // err = dao.GetEntitiesByKV(db, &cats, cond, true)
if err == nil { // if err == nil {
err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) // err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName)
} // }
return nil, err // return nil, err
}) // })
return "", err // return "", err
} // }
func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) {
if !globals.IsUseThingMap { // if !globals.IsUseThingMap {
return v.oldSyncReorderCategories(ctx, db, categoryID, isAsync, userName) // return v.oldSyncReorderCategories(ctx, db, categoryID, isAsync, userName)
} // }
return SyncReorderCategories(ctx, -1, isAsync) return SyncReorderCategories(ctx, -1, isAsync)
} }
func (v *VendorSync) oldSyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { // func (v *VendorSync) oldSyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) {
hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("分类重排序:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { // hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("分类重排序:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) // vendorInfo := batchItemList[0].(*MultiStoreVendorInfo)
multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) // multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID)
err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) // err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName)
if err2 == nil { // if err2 == nil {
cat := &model.SkuCategory{} // cat := &model.SkuCategory{}
_, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]), 0), utils.Params2Map(model.FieldParentID, categoryID)) // _, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]), 0), utils.Params2Map(model.FieldParentID, categoryID))
return nil, err2 // return nil, err2
} // }
return nil, err2 // return nil, err2
}) // })
return "", err // return "", err
} // }
func (v *VendorSync) SyncStore(ctx *jxcontext.Context, db *dao.DaoDB, vendorID, storeID int, isAsync bool, userName string) (hint string, err error) { func (v *VendorSync) SyncStore(ctx *jxcontext.Context, db *dao.DaoDB, vendorID, storeID int, isAsync bool, userName string) (hint string, err error) {
globals.SugarLogger.Debugf("SyncStore, storeID:%d", storeID) globals.SugarLogger.Debugf("SyncStore, storeID:%d", storeID)
@@ -248,109 +247,109 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI
} }
func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) { func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) {
if !globals.IsUseThingMap { // if !globals.IsUseThingMap {
return v.oldSyncSkus(ctx, db, nameIDs, skuIDs, isAsync, isContinueWhenError, userName) // return v.oldSyncSkus(ctx, db, nameIDs, skuIDs, isAsync, isContinueWhenError, userName)
} // }
return SyncSkus(ctx, nil, nil, nil, nameIDs, skuIDs, isAsync) return SyncSkus(ctx, nil, nil, nil, nameIDs, skuIDs, isAsync)
} }
func (v *VendorSync) oldSyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) { // func (v *VendorSync) oldSyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) {
globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameIDs:%v, skuIDs:%v, userName:%s", ctx.GetTrackInfo(), nameIDs, skuIDs, userName) // globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameIDs:%v, skuIDs:%v, userName:%s", ctx.GetTrackInfo(), nameIDs, skuIDs, userName)
isManagedIt := !(len(nameIDs) > 0 && len(nameIDs) <= 2 || len(skuIDs) > 0 && len(skuIDs) < 8) // isManagedIt := !(len(nameIDs) > 0 && len(nameIDs) <= 2 || len(skuIDs) > 0 && len(skuIDs) < 8)
return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt, // return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
var resultList []interface{} // var resultList []interface{}
vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) // vendorInfo := batchItemList[0].(*MultiStoreVendorInfo)
multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) // multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID)
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) // syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()])
dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()]) // dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()])
skuMap := make(map[int]bool) // skuMap := make(map[int]bool)
sql := fmt.Sprintf(` // sql := fmt.Sprintf(`
SELECT DISTINCT t2.* // SELECT DISTINCT t2.*
FROM sku t1 // FROM sku t1
JOIN sku_name t2 ON t2.id = t1.name_id // JOIN sku_name t2 ON t2.id = t1.name_id
WHERE t1.%s_sync_status <> 0 // WHERE t1.%s_sync_status <> 0
`, dbField) // `, dbField)
sqlParams := []interface{}{} // sqlParams := []interface{}{}
if len(nameIDs) > 0 { // if len(nameIDs) > 0 {
sql += " AND t1.name_id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")" // sql += " AND t1.name_id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")"
sqlParams = append(sqlParams, nameIDs) // sqlParams = append(sqlParams, nameIDs)
} // }
if len(skuIDs) > 0 { // if len(skuIDs) > 0 {
sql += " AND t1.id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" // sql += " AND t1.id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs) // sqlParams = append(sqlParams, skuIDs)
} // }
for _, v := range skuIDs { // for _, v := range skuIDs {
skuMap[v] = true // skuMap[v] = true
} // }
sql += " ORDER BY t2.id" // sql += " ORDER BY t2.id"
var skuNameList []*model.SkuName // var skuNameList []*model.SkuName
err := dao.GetRows(db, &skuNameList, sql, sqlParams...) // err := dao.GetRows(db, &skuNameList, sql, sqlParams...)
if err == nil && len(skuNameList) > 0 { // if err == nil && len(skuNameList) > 0 {
// todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 // // todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题
task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorInfo.VendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx, // task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorInfo.VendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
var resultList []interface{} // var resultList []interface{}
skuName := batchItemList[0].(*model.SkuName) // skuName := batchItemList[0].(*model.SkuName)
var skuList []*model.Sku // var skuList []*model.Sku
if err = dao.GetRows(db, &skuList, fmt.Sprintf(` // if err = dao.GetRows(db, &skuList, fmt.Sprintf(`
SELECT * // SELECT *
FROM sku // FROM sku
WHERE name_id = ? AND %s_sync_status <> 0 // WHERE name_id = ? AND %s_sync_status <> 0
ORDER BY IF(spec_unit IN('kg', 'L'), 1000, 1) * spec_quality // ORDER BY IF(spec_unit IN('kg', 'L'), 1000, 1) * spec_quality
`, dbField), skuName.ID); err == nil && len(skuList) > 0 { // `, dbField), skuName.ID); err == nil && len(skuList) > 0 {
for _, sku := range skuList { // for _, sku := range skuList {
syncStatus := refutil.GetObjFieldByName(sku, syncStatusFieldName).(int8) // syncStatus := refutil.GetObjFieldByName(sku, syncStatusFieldName).(int8)
globals.SugarLogger.Debugf("SyncSku trackInfo2:%s, skuID:%d, syncStatus:%d", ctx.GetTrackInfo(), sku.ID, syncStatus) // globals.SugarLogger.Debugf("SyncSku trackInfo2:%s, skuID:%d, syncStatus:%d", ctx.GetTrackInfo(), sku.ID, syncStatus)
if (len(skuIDs) == 0 || skuMap[sku.ID]) && (syncStatus != 0) { // if (len(skuIDs) == 0 || skuMap[sku.ID]) && (syncStatus != 0) {
updateFields := []string{syncStatusFieldName} // updateFields := []string{syncStatusFieldName}
if syncStatus&model.SyncFlagDeletedMask != 0 { // 删除 // if syncStatus&model.SyncFlagDeletedMask != 0 { // 删除
if syncStatus&model.SyncFlagNewMask == 0 { // if syncStatus&model.SyncFlagNewMask == 0 {
err = multiStoresHandler.DeleteSku(db, sku, userName) // err = multiStoresHandler.DeleteSku(db, sku, userName)
} // }
} else if syncStatus&model.SyncFlagNewMask != 0 { // 新增 // } else if syncStatus&model.SyncFlagNewMask != 0 { // 新增
if err = multiStoresHandler.CreateSku(db, sku, userName); err == nil { // if err = multiStoresHandler.CreateSku(db, sku, userName); err == nil {
var tmpStruct struct { // var tmpStruct struct {
MaxIndex int // MaxIndex int
} // }
// todo hard code 得到京东spu中sku的顺序以方便以后修改销售属性这个必须要每次重新从数据库取 // // todo hard code 得到京东spu中sku的顺序以方便以后修改销售属性这个必须要每次重新从数据库取
if dao.GetRow(db, &tmpStruct, "SELECT MAX(sku_index) max_index FROM sku WHERE name_id = ? AND jd_id > 0 AND jd_id < 4024012631406 ", sku.NameID) == nil { // if dao.GetRow(db, &tmpStruct, "SELECT MAX(sku_index) max_index FROM sku WHERE name_id = ? AND jd_id > 0 AND jd_id < 4024012631406 ", sku.NameID) == nil {
sku.SkuIndex = tmpStruct.MaxIndex + 1 // sku.SkuIndex = tmpStruct.MaxIndex + 1
updateFields = append(updateFields, "SkuIndex") // updateFields = append(updateFields, "SkuIndex")
} // }
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) // updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()]))
} // }
} else if syncStatus&model.SyncFlagModifiedMask != 0 { // 修改 // } else if syncStatus&model.SyncFlagModifiedMask != 0 { // 修改
err = multiStoresHandler.UpdateSku(db, sku, userName) // err = multiStoresHandler.UpdateSku(db, sku, userName)
} // }
if err == nil { // if err == nil {
refutil.SetObjFieldByName(sku, syncStatusFieldName, int8(0)) // refutil.SetObjFieldByName(sku, syncStatusFieldName, int8(0))
if _, err = dao.UpdateEntity(db, sku, updateFields...); err != nil { // if _, err = dao.UpdateEntity(db, sku, updateFields...); err != nil {
break // break
} else { // } else {
resultList = append(resultList, 1) // resultList = append(resultList, 1)
} // }
} // }
} // }
} // }
} // }
if err == nil { // if err == nil {
refutil.SetObjFieldByName(skuName, syncStatusFieldName, int8(0)) // refutil.SetObjFieldByName(skuName, syncStatusFieldName, int8(0))
_, err = dao.UpdateEntity(db, skuName, syncStatusFieldName) // _, err = dao.UpdateEntity(db, skuName, syncStatusFieldName)
} // }
return resultList, err // return resultList, err
}, skuNameList) // }, skuNameList)
t.AddChild(task).Run() // t.AddChild(task).Run()
result, err2 := task.GetResult(0) // result, err2 := task.GetResult(0)
if err = err2; err == nil { // if err = err2; err == nil {
resultList = append(resultList, result...) // resultList = append(resultList, result...)
} // }
} // }
return resultList, err // return resultList, err
}) // })
} // }
func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
globals.SugarLogger.Debug("SyncStoresCategory") globals.SugarLogger.Debug("SyncStoresCategory")

View File

@@ -156,10 +156,10 @@ type IMultipleStoresHandler interface {
IPurchasePlatformHandler IPurchasePlatformHandler
GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*BareCategoryInfo, err error) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*BareCategoryInfo, err error)
CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) // CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error)
UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error // UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error // DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) // ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error)
CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error)
UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error)
@@ -167,9 +167,9 @@ type IMultipleStoresHandler interface {
ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error)
// sku // sku
CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) // CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) // UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
DeleteSku(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) // ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error)
CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error)

View File

@@ -2,491 +2,479 @@ package jd
// 这里函数取得的信息除了与自身实体相关的ID比如PARENT ID都已经转换成了本地ID了 // 这里函数取得的信息除了与自身实体相关的ID比如PARENT ID都已经转换成了本地ID了
import ( // type tSkuInfoExt struct {
"fmt" // model.SkuName
"unicode/utf8" // JdCatID int64 `orm:"column(jd_cat_id)"` // 商家类别
// JdCategoryID int `orm:"column(jd_category_id)"` // 到家类别
"git.rosy.net.cn/baseapi/platformapi/jdapi" // SkuCatID int64 `orm:"column(sku_cat_id)"` // 商家特殊类别
"git.rosy.net.cn/baseapi/utils" // Comment string `orm:"size(255)" json:"comment"`
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
)
type tSkuInfoExt struct {
model.SkuName
JdCatID int64 `orm:"column(jd_cat_id)"` // 商家类别
JdCategoryID int `orm:"column(jd_category_id)"` // 到家类别
SkuCatID int64 `orm:"column(sku_cat_id)"` // 商家特殊类别
Comment string `orm:"size(255)" json:"comment"`
}
var (
skuAddParamsKeyMap = map[string]int{
jdapi.KeyUpcCode: 1,
}
)
func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
var jdPid int64
if cat.ParentID != 0 {
pCat := &model.SkuCategory{}
pCat.ID = cat.ParentID
if err = dao.GetEntity(db, pCat); err == nil {
jdPid = pCat.JdID
} else {
return err
}
}
if globals.EnableJdStoreWrite {
result, err2 := getAPI("").AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName)
if err = err2; err == nil {
if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
cat.JdID = jdID
}
}
} else {
cat.JdID = jxutils.GenFakeID()
}
return err
}
func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
if globals.EnableJdStoreWrite {
return getAPI("").UpdateShopCategory(cat.JdID, cat.Name)
}
return nil
}
func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
if globals.EnableJdStoreWrite {
return getAPI("").DelShopCategory(cat.JdID)
}
return nil
}
func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
var parentJDID int64
if parentCatID != 0 {
cat := &model.SkuCategory{}
cat.ID = parentCatID
if err = dao.GetEntity(db, cat); err != nil {
return err
}
parentJDID = cat.JdID
}
var cats []*model.SkuCategory
if err = dao.GetRows(db, &cats, `
SELECT *
FROM sku_category
WHERE parent_id = ? AND deleted_at = ?
ORDER BY seq`, parentCatID, utils.DefaultTimeValue); err == nil {
jdCatIDs := make([]int64, len(cats))
for k, v := range cats {
jdCatIDs[k] = v.JdID
}
if globals.EnableJdStoreWrite {
err = getAPI("").ChangeShopCategoryOrder(parentJDID, jdCatIDs)
}
}
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, `
SELECT
t2.*, IF(t2.jd_category_id > 0, t2.jd_category_id, t3.jd_category_id) jd_category_id,
t3.jd_id jd_cat_id,
t4.jd_id sku_cat_id
FROM sku t1
JOIN sku_name t2 ON t1.name_id = t2.id
JOIN sku_category t3 ON t2.category_id = t3.id
LEFT JOIN sku_category t4 ON t1.category_id = t4.id
WHERE t1.id = ?
`, sku.ID)
if err == nil {
shopCategories := []int64{skuInfoExt.JdCatID}
// SPU只支持SPU的商家分类不支持单独SKU的去除SKU的分类
// if skuInfoExt.SkuCatID != 0 {
// shopCategories = append(shopCategories, skuInfoExt.SkuCatID)
// }
if skuInfoExt.JdCategoryID == 0 {
skuInfoExt.JdCategoryID = getDefJdCategoryID()
}
if skuInfoExt.BrandID == 0 {
skuInfoExt.BrandID = DefBrandID
}
addParams := map[string]interface{}{}
if skuInfoExt.IsGlobal == 0 { //如果不是全国可售,要查可售区域
sellPlaces, err2 := dao.GetSellCities(db, skuInfoExt.ID, model.VendorIDJD)
if err = err2; err == nil && len(sellPlaces) > 0 {
sellCites := make([]int, len(sellPlaces))
for k, v := range sellPlaces {
sellCites[k] = v.JdCode
}
addParams["sellCities"] = sellCites
}
}
if addParams["sellCities"] == nil {
addParams["sellCities"] = []int{0}
}
if skuInfoExt.DescImg != "" {
addParams[jdapi.KeyProductDesc] = fmt.Sprintf(`<img src="%s" alt="一张图片" />`, skuInfoExt.DescImg)
addParams[jdapi.KeyIfViewDesc] = 0
} else {
addParams[jdapi.KeyIfViewDesc] = 1
}
if err == nil {
skuName := jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
skuPrice := jxutils.CaculateSkuPrice(skuInfoExt.Price, sku.SpecQuality, sku.SpecUnit, skuInfoExt.Unit)
if skuInfoExt.Upc != "" {
addParams[jdapi.KeyUpcCode] = skuInfoExt.Upc
}
result, err2 := handler(&skuInfoExt, skuPrice, skuName, shopCategories, addParams)
if err = err2; err == nil {
if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
sku.JdID = jdID
}
}
}
}
return err
}
func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
if skuExt.IsSpu == 0 {
if globals.EnableJdStoreWrite {
vendorSkuID, err = getAPI("").AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2), jxStatus2jdStatus(sku.Status), true, addParams)
if err != nil {
if jdSkuID := jdapi.GetJdSkuIDFromError(err); jdSkuID > 0 {
vendorSkuID = utils.Int64ToStr(jdSkuID)
err = nil
}
}
} else {
vendorSkuID = utils.Int64ToStr(jxutils.GenFakeID())
}
} else {
vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
}
return vendorSkuID, err
})
}
// func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) {
// jdSkuID := utils.Str2Int64(vendorSkuID)
// a := getAPI(vendorOrgCode)
// skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{
// SkuID: jdSkuID,
// })
// if err == nil {
// if len(skuList) >= 1 {
// skuNameExt = &model.SkuNameExt{}
// if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{
// SkuIDs: []int64{jdSkuID},
// }); err2 == nil && len(imgList) > 0 {
// skuNameExt.Img = imgList[0].SourceImgURL
// } // }
// sku := skuList[0]
// prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku.SkuName)
// if name == "" {
// name = sku.SkuName
// unit = "份"
// specUnit = "g"
// }
// skuNameExt.Prefix = prefix
// skuNameExt.Name = name
// skuNameExt.Unit = unit
// skuNameExt.Price = sku.SkuPrice
// skuNameExt.Skus = []*model.SkuWithVendor{
// &model.SkuWithVendor{
// Sku: &model.Sku{
// SpecQuality: specQuality,
// SpecUnit: specUnit,
// Weight: jxutils.FloatWeight2Int(float32(sku.Weight)),
// JdID: sku.SkuID,
// Status: jdStatus2jxStatus(sku.FixedStatus),
// Comment: comment,
// },
// },
// }
// skuNameExt.Skus[0].ID = int(utils.Str2Int64(sku.OutSkuID))
// db := dao.GetDB() // var (
// shopCategories := sku.ShopCategories // skuAddParamsKeyMap = map[string]int{
// if len(shopCategories) > 0 { // jdapi.KeyUpcCode: 1,
// skuCat := &model.SkuCategory{}
// skuCat.JdID = shopCategories[0]
// if dao.GetEntity(db, skuCat, "JdID") == nil {
// skuNameExt.CategoryID = skuCat.ID
// } // }
// } // )
// sellCities := sku.SellCities
// for _, v := range sellCities { // func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
// if v == 0 { // var jdPid int64
// skuNameExt.IsGlobal = 1 // if cat.ParentID != 0 {
// } // pCat := &model.SkuCategory{}
// } // pCat.ID = cat.ParentID
// if len(sellCities) == 0 || skuNameExt.IsGlobal == 1 { // if err = dao.GetEntity(db, pCat); err == nil {
// skuNameExt.IsGlobal = 1 // jdPid = pCat.JdID
// } else { // } else {
// var places []*model.Place // return err
// if err = dao.GetRows(db, &places, "SELECT * FROM place WHERE jd_code IN ("+dao.GenQuestionMarks(len(sellCities))+") AND level = 2", sellCities); err == nil {
// skuNameExt.Places = make([]int, len(places))
// for k, v := range places {
// skuNameExt.Places[k] = v.Code
// } // }
// } // }
// }
// } else {
// err = partner.ErrCanNotFindItem
// }
// }
// return skuNameExt, err
// }
func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
params := utils.MergeMaps(addParams)
params[jdapi.KeyCategoryId] = skuExt.JdCategoryID
params[jdapi.KeyShopCategories] = shopCategories
params[jdapi.KeyBrandId] = skuExt.BrandID
params[jdapi.KeySkuName] = skuName
params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
params[jdapi.KeyImages] = jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2)
params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
if skuExt.IsSpu == 0 {
if globals.EnableJdStoreWrite {
vendorSkuID, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
}
} else {
vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
}
return vendorSkuID, err
})
}
func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
params := map[string]interface{}{
jdapi.KeyFixedStatus: jdapi.SkuFixedStatusDeleted,
}
sql := `
SELECT t2.*
FROM sku t1
JOIN sku_name t2 ON t1.name_id = t2.id
WHERE t1.id = ?
`
var skuExt tSkuInfoExt
err = dao.GetRow(db, &skuExt, sql, sku.ID)
if err == nil {
if skuExt.IsSpu == 0 {
if globals.EnableJdStoreWrite {
_, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
}
} else {
_, err = p.syncSkuNameAsSpu(db, sku, &skuExt, 0, "", nil, nil)
}
}
return err
}
// func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
// globals.SugarLogger.Debugf("jd RefreshAllSkusID")
// db := dao.GetDB()
// var skuPairs []*jdapi.SkuIDPair
// const stepCount = 2
// rootTask := tasksch.NewSeqTask("jd RefreshAllSkusID", ctx,
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
// switch step {
// case 0:
// err = dao.GetRows(db, &skuPairs, `
// SELECT t1.id out_sku_id, t1.jd_id sku_id
// FROM sku t1
// WHERE t1.deleted_at = ?
// `, utils.DefaultTimeValue)
// default:
// taskName := "RefreshAllSkusID update id"
// if step != stepCount-1 {
// taskName = "RefreshAllSkusID update uuid"
// }
// task1 := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true).SetBatchSize(jdapi.MaxBatchSize4BatchUpdateOutSkuId), ctx,
// func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// skuPairs := make([]*jdapi.SkuIDPair, len(batchItemList))
// for k, v := range batchItemList {
// pair := v.(*jdapi.SkuIDPair)
// skuPairs[k] = &jdapi.SkuIDPair{
// SkuId: pair.SkuId,
// OutSkuId: pair.OutSkuId,
// }
// if step != stepCount-1 {
// skuPairs[k].OutSkuId = utils.GetUUID()
// }
// }
// globals.SugarLogger.Debug(utils.Format4Output(skuPairs, false))
// if globals.EnableJdStoreWrite { // if globals.EnableJdStoreWrite {
// _, err = getAPI("").BatchUpdateOutSkuId(skuPairs) // result, err2 := getAPI("").AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName)
// if err = err2; err == nil {
// if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
// cat.JdID = jdID
// } // }
// return nil, err
// }, skuPairs)
// rootTask.AddChild(task1).Run()
// _, err = task1.GetResult(0)
// } // }
// return nil, err // } else {
// }, stepCount) // cat.JdID = jxutils.GenFakeID()
// tasksch.HandleTask(rootTask, parentTask, false).Run()
// if !isAsync {
// _, err = rootTask.GetResult(0)
// } // }
// return rootTask.ID, err // return err
// } // }
func splitAddParams(addParams map[string]interface{}) (spuAddParams, skuAddParams map[string]interface{}) { // func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
if addParams != nil { // if globals.EnableJdStoreWrite {
spuAddParams = make(map[string]interface{}) // return getAPI("").UpdateShopCategory(cat.JdID, cat.Name)
skuAddParams = make(map[string]interface{}) // }
for key := range addParams { // return nil
if skuAddParamsKeyMap[key] == 1 { // }
skuAddParams[key] = addParams[key]
} else {
spuAddParams[key] = addParams[key]
}
}
}
return spuAddParams, skuAddParams
}
// 这个处理JD SPU补丁形式 // func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
func (p *PurchaseHandler) syncSkuNameAsSpu(db *dao.DaoDB, sku *model.Sku, skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) { // if globals.EnableJdStoreWrite {
// SPU的SKU NAME不需要规格信息 // return getAPI("").DelShopCategory(cat.JdID)
skuName = jxutils.ComposeSkuName(skuExt.Prefix, skuExt.Name, sku.Comment, "", 0, "", 0) // }
skuNameJdID := skuExt.JdID // return nil
globals.SugarLogger.Debugf("syncSkuNameAsSpu1 sku.id=%d, bareSkuName:%s, skuName:%s, skuNameJdID:%d", sku.ID, skuExt.Name, skuName, skuNameJdID) // }
spuAddParams, skuAddParams := splitAddParams(addParams)
if !jxutils.IsEmptyID(skuNameJdID) && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除SKU
if globals.EnableJdStoreWrite {
err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
}
}
if err == nil {
updateFields := []string{}
if skuExt.JdSyncStatus&model.SyncFlagDeletedMask != 0 {
sql := `
SELECT COUNT(*) ct
FROM sku t1
WHERE t1.name_id = ? AND (t1.status <> ? OR t1.jd_sync_status <> 0)
`
var count struct {
Ct int
}
if err = dao.GetRow(db, &count, sql, sku.NameID, model.SkuStatusDeleted); err != nil {
return "", err
}
if count.Ct <= 1 && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 1就是最后删的那个
updateFields = append(updateFields, model.FieldJdSyncStatus)
if globals.EnableJdStoreWrite {
if err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil {
err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
}
}
}
} else if skuExt.JdSyncStatus&model.SyncFlagNewMask != 0 && jxutils.IsEmptyID(skuNameJdID) {
if globals.EnableJdStoreWrite {
spuName := jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0)
skus := []map[string]interface{}{
map[string]interface{}{
jdapi.KeyOutSkuId: utils.Int2Str(sku.ID),
jdapi.KeySkuName: skuName,
jdapi.KeyFixedStatus: jxStatus2jdStatus(sku.Status),
jdapi.KeySkuPrice: price,
jdapi.KeyWeight: jxutils.IntWeight2Float(sku.Weight),
jdapi.KeyIsSale: true,
jdapi.FakeKeySpecAttr: composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit),
},
}
skus[0] = utils.MergeMaps(skus[0], skuAddParams)
updateFields = append(updateFields, model.FieldJdSyncStatus)
if globals.EnableJdStoreWrite {
vendorSpuID, skuPairs, err2 := getAPI("").AddSpu(utils.Int2Str(skuExt.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, spuName, []string{skuExt.Img}, jxStatus2jdStatus(skuExt.Status), spuAddParams, skus)
if err = err2; err == nil {
skuExt.JdID = vendorSpuID
// skuNameJdID = skuExt.JdID // 这个是故意去掉的这样之后的首次SKU修改操作就会被忽略下一条语句也就可以不用了
// sku.JdSyncStatus &= ^model.SyncFlagNewMask
vendorSkuID = utils.Int64ToStr(skuPairs[0].SkuId)
updateFields = append(updateFields, model.FieldJdID)
}
}
}
} else if skuExt.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
params := utils.MergeMaps(map[string]interface{}{
jdapi.KeySpuName: jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0),
jdapi.KeyShopCategories: shopCategories,
jdapi.KeyCategoryId: skuExt.JdCategoryID,
jdapi.KeyBrandId: skuExt.BrandID,
jdapi.KeyImages: []string{skuExt.Img},
jdapi.KeyFixedStatus: jxStatus2jdStatus(skuExt.Status),
}, spuAddParams)
updateFields = append(updateFields, model.FieldJdSyncStatus)
if globals.EnableJdStoreWrite {
err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), params)
}
}
if err == nil {
if skuExt.JdSyncStatus != 0 && len(updateFields) > 0 {
skuExt.JdSyncStatus = 0
_, err = dao.UpdateEntity(db, &skuExt.SkuName, updateFields...)
globals.SugarLogger.Debugf("syncSkuNameAsSpu4 sku.id=%d, skuName:%s, skuName:%s", sku.ID, skuExt.Name, utils.Format4Output(&skuExt.SkuName, false))
}
}
}
if err == nil && !jxutils.IsEmptyID(skuNameJdID) {
if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 非首次新增SKU
if globals.EnableJdStoreWrite {
vendorSkuID2, err2 := getAPI("").AppendSku(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, jxStatus2jdStatus(sku.Status), true, composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit), skuAddParams)
if err = err2; err == nil {
vendorSkuID = utils.Int64ToStr(vendorSkuID2)
}
}
} else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
params := make(map[string]interface{})
params[jdapi.KeySkuName] = skuName
params[jdapi.KeyImages] = []string{skuExt.Img}
params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
params[jdapi.KeySkuPrice] = price
if globals.EnableJdStoreWrite {
err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.MergeMaps(params, skuAddParams))
if sku.JdSyncStatus&model.SyncFlagSpecMask != 0 {
skuIndex := sku.SkuIndex
if skuIndex > 0 {
saleAttrValue := composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit)
globals.SugarLogger.Debugf("syncSkuNameAsSpu outSuperId:%d, saleAttrId:%d, saleAttrValueId:%d, saleAttrValueName:%s", skuExt.ID, jdapi.SaleAttrIDBase, jdapi.SaleAttrValueIDBase+skuIndex-1, saleAttrValue)
err = getAPI("").UpdateSpuSaleAttr(utils.Int2Str(skuExt.ID), utils.Int2Str(jdapi.SaleAttrIDBase), "", utils.Int2Str(jdapi.SaleAttrValueIDBase+skuIndex-1), saleAttrValue)
}
}
}
}
if err == nil {
sku.JdSyncStatus = 0
}
}
return vendorSkuID, err
}
func composeSkuSpec(specQuality float32, specUnit, unit string) string { // func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
prefix := "" // var parentJDID int64
if unit == model.SpecialUnit { // if parentCatID != 0 {
prefix = "约" // cat := &model.SkuCategory{}
} // cat.ID = parentCatID
value := prefix + jxutils.ComposeSkuSpec(specQuality, specUnit) // if err = dao.GetEntity(db, cat); err != nil {
suffix := "/" + unit // return err
if utf8.RuneCountInString(value) <= 8-utf8.RuneCountInString(suffix) { // }
value += suffix // parentJDID = cat.JdID
} // }
return value // var cats []*model.SkuCategory
} // if err = dao.GetRows(db, &cats, `
// SELECT *
// FROM sku_category
// WHERE parent_id = ? AND deleted_at = ?
// ORDER BY seq`, parentCatID, utils.DefaultTimeValue); err == nil {
// jdCatIDs := make([]int64, len(cats))
// for k, v := range cats {
// jdCatIDs[k] = v.JdID
// }
// if globals.EnableJdStoreWrite {
// err = getAPI("").ChangeShopCategoryOrder(parentJDID, jdCatIDs)
// }
// }
// 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, `
// SELECT
// t2.*, IF(t2.jd_category_id > 0, t2.jd_category_id, t3.jd_category_id) jd_category_id,
// t3.jd_id jd_cat_id,
// t4.jd_id sku_cat_id
// FROM sku t1
// JOIN sku_name t2 ON t1.name_id = t2.id
// JOIN sku_category t3 ON t2.category_id = t3.id
// LEFT JOIN sku_category t4 ON t1.category_id = t4.id
// WHERE t1.id = ?
// `, sku.ID)
// if err == nil {
// shopCategories := []int64{skuInfoExt.JdCatID}
// // SPU只支持SPU的商家分类不支持单独SKU的去除SKU的分类
// // if skuInfoExt.SkuCatID != 0 {
// // shopCategories = append(shopCategories, skuInfoExt.SkuCatID)
// // }
// if skuInfoExt.JdCategoryID == 0 {
// skuInfoExt.JdCategoryID = getDefJdCategoryID()
// }
// if skuInfoExt.BrandID == 0 {
// skuInfoExt.BrandID = DefBrandID
// }
// addParams := map[string]interface{}{}
// if skuInfoExt.IsGlobal == 0 { //如果不是全国可售,要查可售区域
// sellPlaces, err2 := dao.GetSellCities(db, skuInfoExt.ID, model.VendorIDJD)
// if err = err2; err == nil && len(sellPlaces) > 0 {
// sellCites := make([]int, len(sellPlaces))
// for k, v := range sellPlaces {
// sellCites[k] = v.JdCode
// }
// addParams["sellCities"] = sellCites
// }
// }
// if addParams["sellCities"] == nil {
// addParams["sellCities"] = []int{0}
// }
// if skuInfoExt.DescImg != "" {
// addParams[jdapi.KeyProductDesc] = fmt.Sprintf(`<img src="%s" alt="一张图片" />`, skuInfoExt.DescImg)
// addParams[jdapi.KeyIfViewDesc] = 0
// } else {
// addParams[jdapi.KeyIfViewDesc] = 1
// }
// if err == nil {
// skuName := jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
// skuPrice := jxutils.CaculateSkuPrice(skuInfoExt.Price, sku.SpecQuality, sku.SpecUnit, skuInfoExt.Unit)
// if skuInfoExt.Upc != "" {
// addParams[jdapi.KeyUpcCode] = skuInfoExt.Upc
// }
// result, err2 := handler(&skuInfoExt, skuPrice, skuName, shopCategories, addParams)
// if err = err2; err == nil {
// if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
// sku.JdID = jdID
// }
// }
// }
// }
// return err
// }
// func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
// return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
// if skuExt.IsSpu == 0 {
// if globals.EnableJdStoreWrite {
// vendorSkuID, err = getAPI("").AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2), jxStatus2jdStatus(sku.Status), true, addParams)
// if err != nil {
// if jdSkuID := jdapi.GetJdSkuIDFromError(err); jdSkuID > 0 {
// vendorSkuID = utils.Int64ToStr(jdSkuID)
// err = nil
// }
// }
// } else {
// vendorSkuID = utils.Int64ToStr(jxutils.GenFakeID())
// }
// } else {
// vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
// }
// return vendorSkuID, err
// })
// }
// // func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) {
// // jdSkuID := utils.Str2Int64(vendorSkuID)
// // a := getAPI(vendorOrgCode)
// // skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{
// // SkuID: jdSkuID,
// // })
// // if err == nil {
// // if len(skuList) >= 1 {
// // skuNameExt = &model.SkuNameExt{}
// // if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{
// // SkuIDs: []int64{jdSkuID},
// // }); err2 == nil && len(imgList) > 0 {
// // skuNameExt.Img = imgList[0].SourceImgURL
// // }
// // sku := skuList[0]
// // prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku.SkuName)
// // if name == "" {
// // name = sku.SkuName
// // unit = "份"
// // specUnit = "g"
// // }
// // skuNameExt.Prefix = prefix
// // skuNameExt.Name = name
// // skuNameExt.Unit = unit
// // skuNameExt.Price = sku.SkuPrice
// // skuNameExt.Skus = []*model.SkuWithVendor{
// // &model.SkuWithVendor{
// // Sku: &model.Sku{
// // SpecQuality: specQuality,
// // SpecUnit: specUnit,
// // Weight: jxutils.FloatWeight2Int(float32(sku.Weight)),
// // JdID: sku.SkuID,
// // Status: jdStatus2jxStatus(sku.FixedStatus),
// // Comment: comment,
// // },
// // },
// // }
// // skuNameExt.Skus[0].ID = int(utils.Str2Int64(sku.OutSkuID))
// // db := dao.GetDB()
// // shopCategories := sku.ShopCategories
// // if len(shopCategories) > 0 {
// // skuCat := &model.SkuCategory{}
// // skuCat.JdID = shopCategories[0]
// // if dao.GetEntity(db, skuCat, "JdID") == nil {
// // skuNameExt.CategoryID = skuCat.ID
// // }
// // }
// // sellCities := sku.SellCities
// // for _, v := range sellCities {
// // if v == 0 {
// // skuNameExt.IsGlobal = 1
// // }
// // }
// // if len(sellCities) == 0 || skuNameExt.IsGlobal == 1 {
// // skuNameExt.IsGlobal = 1
// // } else {
// // var places []*model.Place
// // if err = dao.GetRows(db, &places, "SELECT * FROM place WHERE jd_code IN ("+dao.GenQuestionMarks(len(sellCities))+") AND level = 2", sellCities); err == nil {
// // skuNameExt.Places = make([]int, len(places))
// // for k, v := range places {
// // skuNameExt.Places[k] = v.Code
// // }
// // }
// // }
// // } else {
// // err = partner.ErrCanNotFindItem
// // }
// // }
// // return skuNameExt, err
// // }
// func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
// return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
// params := utils.MergeMaps(addParams)
// params[jdapi.KeyCategoryId] = skuExt.JdCategoryID
// params[jdapi.KeyShopCategories] = shopCategories
// params[jdapi.KeyBrandId] = skuExt.BrandID
// params[jdapi.KeySkuName] = skuName
// params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
// params[jdapi.KeyImages] = jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2)
// params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
// if skuExt.IsSpu == 0 {
// if globals.EnableJdStoreWrite {
// vendorSkuID, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
// }
// } else {
// vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
// }
// return vendorSkuID, err
// })
// }
// func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
// params := map[string]interface{}{
// jdapi.KeyFixedStatus: jdapi.SkuFixedStatusDeleted,
// }
// sql := `
// SELECT t2.*
// FROM sku t1
// JOIN sku_name t2 ON t1.name_id = t2.id
// WHERE t1.id = ?
// `
// var skuExt tSkuInfoExt
// err = dao.GetRow(db, &skuExt, sql, sku.ID)
// if err == nil {
// if skuExt.IsSpu == 0 {
// if globals.EnableJdStoreWrite {
// _, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
// }
// } else {
// _, err = p.syncSkuNameAsSpu(db, sku, &skuExt, 0, "", nil, nil)
// }
// }
// return err
// }
// // func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
// // globals.SugarLogger.Debugf("jd RefreshAllSkusID")
// // db := dao.GetDB()
// // var skuPairs []*jdapi.SkuIDPair
// // const stepCount = 2
// // rootTask := tasksch.NewSeqTask("jd RefreshAllSkusID", ctx,
// // func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
// // switch step {
// // case 0:
// // err = dao.GetRows(db, &skuPairs, `
// // SELECT t1.id out_sku_id, t1.jd_id sku_id
// // FROM sku t1
// // WHERE t1.deleted_at = ?
// // `, utils.DefaultTimeValue)
// // default:
// // taskName := "RefreshAllSkusID update id"
// // if step != stepCount-1 {
// // taskName = "RefreshAllSkusID update uuid"
// // }
// // task1 := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true).SetBatchSize(jdapi.MaxBatchSize4BatchUpdateOutSkuId), ctx,
// // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// // skuPairs := make([]*jdapi.SkuIDPair, len(batchItemList))
// // for k, v := range batchItemList {
// // pair := v.(*jdapi.SkuIDPair)
// // skuPairs[k] = &jdapi.SkuIDPair{
// // SkuId: pair.SkuId,
// // OutSkuId: pair.OutSkuId,
// // }
// // if step != stepCount-1 {
// // skuPairs[k].OutSkuId = utils.GetUUID()
// // }
// // }
// // globals.SugarLogger.Debug(utils.Format4Output(skuPairs, false))
// // if globals.EnableJdStoreWrite {
// // _, err = getAPI("").BatchUpdateOutSkuId(skuPairs)
// // }
// // return nil, err
// // }, skuPairs)
// // rootTask.AddChild(task1).Run()
// // _, err = task1.GetResult(0)
// // }
// // return nil, err
// // }, stepCount)
// // tasksch.HandleTask(rootTask, parentTask, false).Run()
// // if !isAsync {
// // _, err = rootTask.GetResult(0)
// // }
// // return rootTask.ID, err
// // }
// func splitAddParams(addParams map[string]interface{}) (spuAddParams, skuAddParams map[string]interface{}) {
// if addParams != nil {
// spuAddParams = make(map[string]interface{})
// skuAddParams = make(map[string]interface{})
// for key := range addParams {
// if skuAddParamsKeyMap[key] == 1 {
// skuAddParams[key] = addParams[key]
// } else {
// spuAddParams[key] = addParams[key]
// }
// }
// }
// return spuAddParams, skuAddParams
// }
// // 这个处理JD SPU补丁形式
// func (p *PurchaseHandler) syncSkuNameAsSpu(db *dao.DaoDB, sku *model.Sku, skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
// // SPU的SKU NAME不需要规格信息
// skuName = jxutils.ComposeSkuName(skuExt.Prefix, skuExt.Name, sku.Comment, "", 0, "", 0)
// skuNameJdID := skuExt.JdID
// globals.SugarLogger.Debugf("syncSkuNameAsSpu1 sku.id=%d, bareSkuName:%s, skuName:%s, skuNameJdID:%d", sku.ID, skuExt.Name, skuName, skuNameJdID)
// spuAddParams, skuAddParams := splitAddParams(addParams)
// if !jxutils.IsEmptyID(skuNameJdID) && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除SKU
// if globals.EnableJdStoreWrite {
// err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
// }
// }
// if err == nil {
// updateFields := []string{}
// if skuExt.JdSyncStatus&model.SyncFlagDeletedMask != 0 {
// sql := `
// SELECT COUNT(*) ct
// FROM sku t1
// WHERE t1.name_id = ? AND (t1.status <> ? OR t1.jd_sync_status <> 0)
// `
// var count struct {
// Ct int
// }
// if err = dao.GetRow(db, &count, sql, sku.NameID, model.SkuStatusDeleted); err != nil {
// return "", err
// }
// if count.Ct <= 1 && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 1就是最后删的那个
// updateFields = append(updateFields, model.FieldJdSyncStatus)
// if globals.EnableJdStoreWrite {
// if err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil {
// err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
// }
// }
// }
// } else if skuExt.JdSyncStatus&model.SyncFlagNewMask != 0 && jxutils.IsEmptyID(skuNameJdID) {
// if globals.EnableJdStoreWrite {
// spuName := jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0)
// skus := []map[string]interface{}{
// map[string]interface{}{
// jdapi.KeyOutSkuId: utils.Int2Str(sku.ID),
// jdapi.KeySkuName: skuName,
// jdapi.KeyFixedStatus: jxStatus2jdStatus(sku.Status),
// jdapi.KeySkuPrice: price,
// jdapi.KeyWeight: jxutils.IntWeight2Float(sku.Weight),
// jdapi.KeyIsSale: true,
// jdapi.FakeKeySpecAttr: composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit),
// },
// }
// skus[0] = utils.MergeMaps(skus[0], skuAddParams)
// updateFields = append(updateFields, model.FieldJdSyncStatus)
// if globals.EnableJdStoreWrite {
// vendorSpuID, skuPairs, err2 := getAPI("").AddSpu(utils.Int2Str(skuExt.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, spuName, []string{skuExt.Img}, jxStatus2jdStatus(skuExt.Status), spuAddParams, skus)
// if err = err2; err == nil {
// skuExt.JdID = vendorSpuID
// // skuNameJdID = skuExt.JdID // 这个是故意去掉的这样之后的首次SKU修改操作就会被忽略下一条语句也就可以不用了
// // sku.JdSyncStatus &= ^model.SyncFlagNewMask
// vendorSkuID = utils.Int64ToStr(skuPairs[0].SkuId)
// updateFields = append(updateFields, model.FieldJdID)
// }
// }
// }
// } else if skuExt.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
// params := utils.MergeMaps(map[string]interface{}{
// jdapi.KeySpuName: jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0),
// jdapi.KeyShopCategories: shopCategories,
// jdapi.KeyCategoryId: skuExt.JdCategoryID,
// jdapi.KeyBrandId: skuExt.BrandID,
// jdapi.KeyImages: []string{skuExt.Img},
// jdapi.KeyFixedStatus: jxStatus2jdStatus(skuExt.Status),
// }, spuAddParams)
// updateFields = append(updateFields, model.FieldJdSyncStatus)
// if globals.EnableJdStoreWrite {
// err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), params)
// }
// }
// if err == nil {
// if skuExt.JdSyncStatus != 0 && len(updateFields) > 0 {
// skuExt.JdSyncStatus = 0
// _, err = dao.UpdateEntity(db, &skuExt.SkuName, updateFields...)
// globals.SugarLogger.Debugf("syncSkuNameAsSpu4 sku.id=%d, skuName:%s, skuName:%s", sku.ID, skuExt.Name, utils.Format4Output(&skuExt.SkuName, false))
// }
// }
// }
// if err == nil && !jxutils.IsEmptyID(skuNameJdID) {
// if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 非首次新增SKU
// if globals.EnableJdStoreWrite {
// vendorSkuID2, err2 := getAPI("").AppendSku(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, jxStatus2jdStatus(sku.Status), true, composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit), skuAddParams)
// if err = err2; err == nil {
// vendorSkuID = utils.Int64ToStr(vendorSkuID2)
// }
// }
// } else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
// params := make(map[string]interface{})
// params[jdapi.KeySkuName] = skuName
// params[jdapi.KeyImages] = []string{skuExt.Img}
// params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
// params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
// params[jdapi.KeySkuPrice] = price
// if globals.EnableJdStoreWrite {
// err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.MergeMaps(params, skuAddParams))
// if sku.JdSyncStatus&model.SyncFlagSpecMask != 0 {
// skuIndex := sku.SkuIndex
// if skuIndex > 0 {
// saleAttrValue := composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit)
// globals.SugarLogger.Debugf("syncSkuNameAsSpu outSuperId:%d, saleAttrId:%d, saleAttrValueId:%d, saleAttrValueName:%s", skuExt.ID, jdapi.SaleAttrIDBase, jdapi.SaleAttrValueIDBase+skuIndex-1, saleAttrValue)
// err = getAPI("").UpdateSpuSaleAttr(utils.Int2Str(skuExt.ID), utils.Int2Str(jdapi.SaleAttrIDBase), "", utils.Int2Str(jdapi.SaleAttrValueIDBase+skuIndex-1), saleAttrValue)
// }
// }
// }
// }
// if err == nil {
// sku.JdSyncStatus = 0
// }
// }
// return vendorSkuID, err
// }
// func composeSkuSpec(specQuality float32, specUnit, unit string) string {
// prefix := ""
// if unit == model.SpecialUnit {
// prefix = "约"
// }
// value := prefix + jxutils.ComposeSkuSpec(specQuality, specUnit)
// suffix := "/" + unit
// if utf8.RuneCountInString(value) <= 8-utf8.RuneCountInString(suffix) {
// value += suffix
// }
// return value
// }

View File

@@ -9,25 +9,25 @@ import (
"git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner"
) )
func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { // func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
return err // return err
} // }
func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) { func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) {
return cats, err return cats, err
} }
func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { // func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
return nil // return nil
} // }
func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { // func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
return nil // return nil
} // }
func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) { // func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
return err // return err
} // }
func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) {
return err return err
@@ -45,21 +45,21 @@ func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCo
return err return err
} }
func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return err // return err
} // }
// func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, 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 // return skuNameExt, err
// } // }
func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return err // return err
} // }
func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return err // return err
} // }
func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) {
return err return err