From b6e8c33012de5090569b854c1990c45648d99bdd Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 17 Dec 2019 16:51:45 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E8=80=81=E7=9A=84sku?= =?UTF-8?q?=E4=B8=8Ecategory=E7=9B=B8=E5=85=B3=E5=A4=9A=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync.go | 409 ++++++------- business/partner/partner.go | 14 +- business/partner/purchase/jd/sku.go | 920 ++++++++++++++-------------- business/partner/purchase/jx/sku.go | 42 +- 4 files changed, 686 insertions(+), 699 deletions(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index ce4d1d81f..894c6796d 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -12,7 +12,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" - "git.rosy.net.cn/jx-callback/globals/refutil" ) type LoopStoreMapInfo struct { @@ -47,36 +46,36 @@ var ( ErrEntityNotExist = errors.New("找不到相应实体") ) -func (p *MultiStoreHandlerWrapper) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { - if jxutils.IsEmptyID(cat.JdID) { - return nil - } - return p.IMultipleStoresHandler.DeleteCategory(db, cat, userName) -} +// func (p *MultiStoreHandlerWrapper) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { +// if jxutils.IsEmptyID(cat.JdID) { +// return nil +// } +// return p.IMultipleStoresHandler.DeleteCategory(db, cat, userName) +// } -func (p *MultiStoreHandlerWrapper) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { - if jxutils.IsEmptyID(cat.JdID) { - globals.SugarLogger.Warnf("UpdateCategory fakeid cat:%s should not get here", utils.Format4Output(cat, true)) - return nil - } - return p.IMultipleStoresHandler.UpdateCategory(db, cat, userName) -} +// func (p *MultiStoreHandlerWrapper) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { +// if jxutils.IsEmptyID(cat.JdID) { +// globals.SugarLogger.Warnf("UpdateCategory fakeid cat:%s should not get here", utils.Format4Output(cat, true)) +// return nil +// } +// return p.IMultipleStoresHandler.UpdateCategory(db, cat, userName) +// } -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)) - if jxutils.IsEmptyID(sku.JdID) { - return nil - } - return p.IMultipleStoresHandler.DeleteSku(db, sku, userName) -} +// 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)) +// if jxutils.IsEmptyID(sku.JdID) { +// return nil +// } +// return p.IMultipleStoresHandler.DeleteSku(db, sku, userName) +// } -func (p *MultiStoreHandlerWrapper) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { - if jxutils.IsEmptyID(sku.JdID) { - globals.SugarLogger.Warnf("UpdateSku fakeid sku:%s should not get here", utils.Format4Output(sku, true)) - return nil - } - return p.IMultipleStoresHandler.UpdateSku(db, sku, userName) -} +// func (p *MultiStoreHandlerWrapper) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { +// if jxutils.IsEmptyID(sku.JdID) { +// globals.SugarLogger.Warnf("UpdateSku fakeid sku:%s should not get here", utils.Format4Output(sku, true)) +// return nil +// } +// return p.IMultipleStoresHandler.UpdateSku(db, sku, userName) +// } func (v *VendorSync) GetStoreHandler(vendorID int) partner.IPurchasePlatformHandler { return partner.GetPurchasePlatformFromVendorID(vendorID) @@ -96,95 +95,95 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan return nil } -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) - syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) - task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorID]), nil, ctx, - func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { - cat := batchItemList[0].(*model.SkuCategory) - updateFields := []string{syncStatusFieldName} - syncStatus := refutil.GetObjFieldByName(cat, syncStatusFieldName).(int8) - if (syncStatus & model.SyncFlagDeletedMask) != 0 { //删除 - if (syncStatus & model.SyncFlagNewMask) == 0 { - err = multiStoresHandler.DeleteCategory(db, cat, userName) - } - } else if (syncStatus & model.SyncFlagNewMask) != 0 { // 新增 - err = multiStoresHandler.CreateCategory(db, cat, userName) - updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) - } else if (syncStatus & model.SyncFlagModifiedMask) != 0 { // 修改 - err = multiStoresHandler.UpdateCategory(db, cat, userName) - if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.IntCode() == -3 { - err = nil - } - } - if err == nil { - refutil.SetObjFieldByName(cat, syncStatusFieldName, int8(0)) - _, err = dao.UpdateEntity(db, cat, updateFields...) - } - return nil, err - }, cats) - tasksch.HandleTask(task, parentTask, false).Run() - _, err = task.GetResult(0) - return err -} +// 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) +// syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) +// task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorID]), nil, ctx, +// func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { +// cat := batchItemList[0].(*model.SkuCategory) +// updateFields := []string{syncStatusFieldName} +// syncStatus := refutil.GetObjFieldByName(cat, syncStatusFieldName).(int8) +// if (syncStatus & model.SyncFlagDeletedMask) != 0 { //删除 +// if (syncStatus & model.SyncFlagNewMask) == 0 { +// err = multiStoresHandler.DeleteCategory(db, cat, userName) +// } +// } else if (syncStatus & model.SyncFlagNewMask) != 0 { // 新增 +// err = multiStoresHandler.CreateCategory(db, cat, userName) +// updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) +// } else if (syncStatus & model.SyncFlagModifiedMask) != 0 { // 修改 +// err = multiStoresHandler.UpdateCategory(db, cat, userName) +// if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.IntCode() == -3 { +// err = nil +// } +// } +// if err == nil { +// refutil.SetObjFieldByName(cat, syncStatusFieldName, int8(0)) +// _, err = dao.UpdateEntity(db, cat, updateFields...) +// } +// return nil, err +// }, cats) +// tasksch.HandleTask(task, parentTask, false).Run() +// _, err = task.GetResult(0) +// return err +// } func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { - if !globals.IsUseThingMap { - return v.oldSyncCategory(ctx, db, categoryID, isAsync, userName) - } + // if !globals.IsUseThingMap { + // return v.oldSyncCategory(ctx, db, categoryID, isAsync, userName) + // } 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) { - globals.SugarLogger.Debug("SyncCategory") - 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) - var cats []*model.SkuCategory - cond := make(map[string]interface{}) - if categoryID > 0 { - cond[model.FieldID] = categoryID - } else { - cond[model.FieldLevel] = 1 - } - err := dao.GetEntitiesByKV(db, &cats, cond, true) - if err == nil { - err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) - } - if err != nil || categoryID > 0 { - return nil, err - } - cond[model.FieldLevel] = 2 - err = dao.GetEntitiesByKV(db, &cats, cond, true) - if err == nil { - err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) - } - return nil, err - }) - return "", err -} +// func (v *VendorSync) oldSyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { +// globals.SugarLogger.Debug("SyncCategory") +// 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) +// var cats []*model.SkuCategory +// cond := make(map[string]interface{}) +// if categoryID > 0 { +// cond[model.FieldID] = categoryID +// } else { +// cond[model.FieldLevel] = 1 +// } +// err := dao.GetEntitiesByKV(db, &cats, cond, true) +// if err == nil { +// err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) +// } +// if err != nil || categoryID > 0 { +// return nil, err +// } +// cond[model.FieldLevel] = 2 +// err = dao.GetEntitiesByKV(db, &cats, cond, true) +// if err == nil { +// err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) +// } +// return nil, err +// }) +// return "", err +// } func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { - if !globals.IsUseThingMap { - return v.oldSyncReorderCategories(ctx, db, categoryID, isAsync, userName) - } + // if !globals.IsUseThingMap { + // return v.oldSyncReorderCategories(ctx, db, categoryID, isAsync, userName) + // } 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) { - 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) - multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) - err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) - if err2 == nil { - cat := &model.SkuCategory{} - _, 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 "", err -} +// 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) { +// vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) +// multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) +// err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) +// if err2 == nil { +// cat := &model.SkuCategory{} +// _, 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 "", err +// } 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) @@ -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) { - if !globals.IsUseThingMap { - return v.oldSyncSkus(ctx, db, nameIDs, skuIDs, isAsync, isContinueWhenError, userName) - } + // if !globals.IsUseThingMap { + // return v.oldSyncSkus(ctx, db, nameIDs, skuIDs, isAsync, isContinueWhenError, userName) + // } 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) { - 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) - 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) { - var resultList []interface{} - vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) - multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) - syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) - dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()]) - skuMap := make(map[int]bool) - sql := fmt.Sprintf(` - SELECT DISTINCT t2.* - FROM sku t1 - JOIN sku_name t2 ON t2.id = t1.name_id - WHERE t1.%s_sync_status <> 0 - `, dbField) - sqlParams := []interface{}{} - if len(nameIDs) > 0 { - sql += " AND t1.name_id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")" - sqlParams = append(sqlParams, nameIDs) - } - if len(skuIDs) > 0 { - sql += " AND t1.id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" - sqlParams = append(sqlParams, skuIDs) +// 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) +// 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, +// func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { +// var resultList []interface{} +// vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) +// multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) +// syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) +// dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()]) +// skuMap := make(map[int]bool) +// sql := fmt.Sprintf(` +// SELECT DISTINCT t2.* +// FROM sku t1 +// JOIN sku_name t2 ON t2.id = t1.name_id +// WHERE t1.%s_sync_status <> 0 +// `, dbField) +// sqlParams := []interface{}{} +// if len(nameIDs) > 0 { +// sql += " AND t1.name_id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")" +// sqlParams = append(sqlParams, nameIDs) +// } +// if len(skuIDs) > 0 { +// sql += " AND t1.id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" +// sqlParams = append(sqlParams, skuIDs) - } - for _, v := range skuIDs { - skuMap[v] = true - } - sql += " ORDER BY t2.id" +// } +// for _, v := range skuIDs { +// skuMap[v] = true +// } +// sql += " ORDER BY t2.id" - var skuNameList []*model.SkuName - err := dao.GetRows(db, &skuNameList, sql, sqlParams...) - if err == nil && len(skuNameList) > 0 { - // todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 - 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) { - var resultList []interface{} - skuName := batchItemList[0].(*model.SkuName) - var skuList []*model.Sku - if err = dao.GetRows(db, &skuList, fmt.Sprintf(` - SELECT * - FROM sku - WHERE name_id = ? AND %s_sync_status <> 0 - ORDER BY IF(spec_unit IN('kg', 'L'), 1000, 1) * spec_quality - `, dbField), skuName.ID); err == nil && len(skuList) > 0 { - for _, sku := range skuList { - syncStatus := refutil.GetObjFieldByName(sku, syncStatusFieldName).(int8) - globals.SugarLogger.Debugf("SyncSku trackInfo2:%s, skuID:%d, syncStatus:%d", ctx.GetTrackInfo(), sku.ID, syncStatus) - if (len(skuIDs) == 0 || skuMap[sku.ID]) && (syncStatus != 0) { - updateFields := []string{syncStatusFieldName} - if syncStatus&model.SyncFlagDeletedMask != 0 { // 删除 - if syncStatus&model.SyncFlagNewMask == 0 { - err = multiStoresHandler.DeleteSku(db, sku, userName) - } - } else if syncStatus&model.SyncFlagNewMask != 0 { // 新增 - if err = multiStoresHandler.CreateSku(db, sku, userName); err == nil { - var tmpStruct struct { - MaxIndex int - } - // 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 { - sku.SkuIndex = tmpStruct.MaxIndex + 1 - updateFields = append(updateFields, "SkuIndex") - } - updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) - } - } else if syncStatus&model.SyncFlagModifiedMask != 0 { // 修改 - err = multiStoresHandler.UpdateSku(db, sku, userName) - } - if err == nil { - refutil.SetObjFieldByName(sku, syncStatusFieldName, int8(0)) - if _, err = dao.UpdateEntity(db, sku, updateFields...); err != nil { - break - } else { - resultList = append(resultList, 1) - } - } - } - } - } - if err == nil { - refutil.SetObjFieldByName(skuName, syncStatusFieldName, int8(0)) - _, err = dao.UpdateEntity(db, skuName, syncStatusFieldName) - } - return resultList, err - }, skuNameList) - t.AddChild(task).Run() - result, err2 := task.GetResult(0) - if err = err2; err == nil { - resultList = append(resultList, result...) - } - } - return resultList, err - }) -} +// var skuNameList []*model.SkuName +// err := dao.GetRows(db, &skuNameList, sql, sqlParams...) +// if err == nil && len(skuNameList) > 0 { +// // todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 +// 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) { +// var resultList []interface{} +// skuName := batchItemList[0].(*model.SkuName) +// var skuList []*model.Sku +// if err = dao.GetRows(db, &skuList, fmt.Sprintf(` +// SELECT * +// FROM sku +// WHERE name_id = ? AND %s_sync_status <> 0 +// ORDER BY IF(spec_unit IN('kg', 'L'), 1000, 1) * spec_quality +// `, dbField), skuName.ID); err == nil && len(skuList) > 0 { +// for _, sku := range skuList { +// syncStatus := refutil.GetObjFieldByName(sku, syncStatusFieldName).(int8) +// globals.SugarLogger.Debugf("SyncSku trackInfo2:%s, skuID:%d, syncStatus:%d", ctx.GetTrackInfo(), sku.ID, syncStatus) +// if (len(skuIDs) == 0 || skuMap[sku.ID]) && (syncStatus != 0) { +// updateFields := []string{syncStatusFieldName} +// if syncStatus&model.SyncFlagDeletedMask != 0 { // 删除 +// if syncStatus&model.SyncFlagNewMask == 0 { +// err = multiStoresHandler.DeleteSku(db, sku, userName) +// } +// } else if syncStatus&model.SyncFlagNewMask != 0 { // 新增 +// if err = multiStoresHandler.CreateSku(db, sku, userName); err == nil { +// var tmpStruct struct { +// MaxIndex int +// } +// // 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 { +// sku.SkuIndex = tmpStruct.MaxIndex + 1 +// updateFields = append(updateFields, "SkuIndex") +// } +// updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) +// } +// } else if syncStatus&model.SyncFlagModifiedMask != 0 { // 修改 +// err = multiStoresHandler.UpdateSku(db, sku, userName) +// } +// if err == nil { +// refutil.SetObjFieldByName(sku, syncStatusFieldName, int8(0)) +// if _, err = dao.UpdateEntity(db, sku, updateFields...); err != nil { +// break +// } else { +// resultList = append(resultList, 1) +// } +// } +// } +// } +// } +// if err == nil { +// refutil.SetObjFieldByName(skuName, syncStatusFieldName, int8(0)) +// _, err = dao.UpdateEntity(db, skuName, syncStatusFieldName) +// } +// return resultList, err +// }, skuNameList) +// t.AddChild(task).Run() +// result, err2 := task.GetResult(0) +// if err = err2; err == nil { +// resultList = append(resultList, result...) +// } +// } +// 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) { globals.SugarLogger.Debug("SyncStoresCategory") diff --git a/business/partner/partner.go b/business/partner/partner.go index f9146c15d..2f8587541 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -156,10 +156,10 @@ type IMultipleStoresHandler interface { IPurchasePlatformHandler GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*BareCategoryInfo, err error) - CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) - UpdateCategory(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) + // CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) + // UpdateCategory(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) CreateCategory2(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) // sku - CreateSku(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) + // CreateSku(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) // ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 214aea54b..5643a4c7b 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -2,491 +2,479 @@ package jd // 这里函数取得的信息,除了与自身实体相关的ID(比如PARENT ID),都已经转换成了本地ID了 -import ( - "fmt" - "unicode/utf8" +// 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"` +// } - "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/model" - "git.rosy.net.cn/jx-callback/business/model/dao" - "git.rosy.net.cn/jx-callback/globals" -) +// var ( +// skuAddParamsKeyMap = map[string]int{ +// jdapi.KeyUpcCode: 1, +// } +// ) -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"` -} +// 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 +// } -var ( - skuAddParamsKeyMap = map[string]int{ - jdapi.KeyUpcCode: 1, - } -) +// 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) 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) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { +// if globals.EnableJdStoreWrite { +// return getAPI("").DelShopCategory(cat.JdID) +// } +// return nil +// } -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) 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) 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(`一张图片`, 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, -// }) +// 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 { -// 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)) +// 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{}{} -// 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 +// 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(`一张图片`, 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 // } // } -// sellCities := sku.SellCities -// for _, v := range sellCities { -// if v == 0 { -// skuNameExt.IsGlobal = 1 +// } +// } +// 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 +// } // } -// } -// 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 +// 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 { -// err = partner.ErrCanNotFindItem +// } 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)) +// } // } // } -// 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" +// 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) // } -// 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) +// } 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 rootTask.ID, err +// return vendorSkuID, 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 -} +// 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 +// } diff --git a/business/partner/purchase/jx/sku.go b/business/partner/purchase/jx/sku.go index 7673a1423..32daa9b18 100644 --- a/business/partner/purchase/jx/sku.go +++ b/business/partner/purchase/jx/sku.go @@ -9,25 +9,25 @@ import ( "git.rosy.net.cn/jx-callback/business/partner" ) -func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { - return err -} +// func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { +// return err +// } func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) { return cats, err } -func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { - return nil -} +// func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { +// return nil +// } -func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { - return nil -} +// func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { +// return nil +// } -func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) { - return err -} +// func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) { +// return err +// } func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { return err @@ -45,21 +45,21 @@ func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCo return err } -func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { - return err -} +// func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { +// return err +// } // func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { // return skuNameExt, err // } -func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { - return err -} +// func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { +// return err +// } -func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { - return err -} +// func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { +// return err +// } func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { return err From 2c69e934f823475f4dfda47a253f7296aa9483e3 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 17 Dec 2019 17:23:46 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=99=90=E5=88=B6=E9=A5=BF=E7=99=BE?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=9A=84=E5=95=86=E5=AE=B6=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/ebai/store_sku2.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index df5508141..ec7e619d8 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -305,7 +305,7 @@ func jxCatSeq2Ebai(seq int) int { } func formatCatName(name string) string { - return name + return utils.LimitUTF8StringLen(name, ebaiapi.MaxCategoryNameLen) } func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) { From 0cc04cc9d2b4d1f6e696cabaf7e37d01df2b8ce6 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 17 Dec 2019 18:01:24 +0800 Subject: [PATCH 3/5] +OrderStatusVendorRejectCancel,OrderStatusVendorAgreeCancel --- business/model/const.go | 19 ++++++++-------- business/model/order.go | 2 +- business/partner/purchase/ebai/order.go | 22 ++++++++++--------- business/partner/purchase/jd/order.go | 3 +++ business/partner/purchase/jx/localjx/order.go | 4 ++-- business/partner/purchase/mtwm/order.go | 2 +- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/business/model/const.go b/business/model/const.go index f9bad6472..496ba1fa5 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -35,7 +35,6 @@ var ( OrderStatusMsg: "通知消息", OrderStatusRefuseFailedGetGoods: "取货失败审核驳回", OrderStatusAdjust: "订单调整完成", - OrderStatusWait4Pay: "待付款", OrderStatusApplyUrgeOrder: "催单", OrderStatusUnlocked: "解锁", @@ -46,7 +45,7 @@ var ( OrderStatusUnknown: "一般事件", - OrderStatusCreated: "待支付", + OrderStatusWait4Pay: "待付款", OrderStatusNew: "新订单", OrderStatusAccepted: "待拣货", OrderStatusFinishedPickup: "待配送", @@ -163,17 +162,17 @@ const ( OrderStatusRefuseFailedGetGoods = -70 // 取货失败审核驳回 OrderStatusAdjust = -65 // 原值-35 订单调整完成 - OrderStatusWait4Pay = -60 // 原值-30 下单待支付,微盟在这个时间发新订单事件 OrderStatusApplyUrgeOrder = -55 // 原值-15 - OrderStatusUnlocked = -25 - OrderStatusLocked = -20 - // OrderStatusApplyRefund = -10 - OrderStatusUndoApplyCancel = -10 - OrderStatusApplyCancel = -5 + OrderStatusUnlocked = -25 + OrderStatusLocked = -20 + OrderStatusUndoApplyCancel = -10 + OrderStatusVendorRejectCancel = -7 + OrderStatusVendorAgreeCancel = -6 + OrderStatusApplyCancel = -5 OrderStatusUnknown = 0 - OrderStatusCreated = 2 // 已支付 + OrderStatusWait4Pay = 2 // 原值-60 下单待支付 OrderStatusNew = 5 // 新订单,实际是已经支付 OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货 OrderStatusFinishedPickup = 15 // 拣货完成 @@ -336,7 +335,7 @@ func IsOrderLockStatus(status int) bool { } func IsOrderUnlockStatus(status int) bool { - return status == OrderStatusUnlocked || status == OrderStatusUndoApplyCancel + return status == OrderStatusUnlocked || status == OrderStatusUndoApplyCancel || status == OrderStatusVendorAgreeCancel || status == OrderStatusVendorRejectCancel } func IsOrderMainStatus(status int) bool { diff --git a/business/model/order.go b/business/model/order.go index d330ce167..98a62b783 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -76,7 +76,7 @@ type GoodsOrder struct { GoodsCount int `json:"goodsCount"` // 商品个数 Status int `json:"status"` // 参见OrderStatus*相关的常量定义 VendorStatus string `orm:"size(255)" json:"vendorStatus"` - LockStatus int `json:"lockStatus"` + LockStatus int `json:"lockStatus"` // 当前只支持单一锁定 LockStatusTime time.Time `orm:"type(datetime);null" json:"lockStatusTime"` // last lock status time OrderSeq int `json:"orderSeq"` // 门店订单序号 BuyerComment string `orm:"size(255)" json:"buyerComment"` diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 83f53d018..3c1804856 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -28,8 +28,6 @@ const ( callDeliveryDelay = 10 * time.Minute callDeliveryDelayGap = 30 - fakeUserApplyCancel = "fake_user_apply_cancel" - fakeUserUndoApplyCancel = "fake_user_undo_apply_cancel" fakeAcceptOrder = "fake_accept_order" fakeOrderAdjustFinished = "fake_order_adjust_finished" fakeOrderCanceled = "fake_order_canceled" @@ -49,8 +47,6 @@ var ( ebaiapi.OrderStatusCanceled: model.OrderStatusCanceled, fakeOrderAdjustFinished: model.OrderStatusAdjust, - fakeUserApplyCancel: model.OrderStatusApplyCancel, - fakeUserUndoApplyCancel: model.OrderStatusUndoApplyCancel, fakeOrderCanceled: model.OrderStatusCanceled, } @@ -478,11 +474,15 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta if cancelType == ebaiapi.OrderUserCancelTypeBeforeSale { if msgType == ebaiapi.OrderUserCancelApply || msgType == ebaiapi.OrderUserCancelCSIntervene { - orderStatus.VendorStatus = fakeUserApplyCancel - } else if msgType == ebaiapi.OrderUserCancelInvalid || - msgType == ebaiapi.OrderUserCancelMerchantRefused || - msgType == ebaiapi.OrderUserCancelCSRefused { - orderStatus.VendorStatus = fakeUserUndoApplyCancel + orderStatus.Status = model.OrderStatusApplyCancel + } else if msgType == ebaiapi.OrderUserCancelCSRefused || + msgType == ebaiapi.OrderUserCancelMerchantRefused { + orderStatus.Status = model.OrderStatusVendorRejectCancel + } else if msgType == ebaiapi.OrderUserCancelInvalid { + orderStatus.Status = model.OrderStatusUndoApplyCancel + } else if msgType == ebaiapi.OrderUserCancelCSAgreed || + msgType == ebaiapi.OrderUserCancelMerchantAgreed { + orderStatus.Status = model.OrderStatusVendorAgreeCancel } } } else if msg.Cmd == ebaiapi.CmdOrderPartRefund { @@ -500,7 +500,9 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta } orderStatus.Remark = utils.Interface2String(msg.Body["reason"]) } - orderStatus.Status = c.getStatusFromVendorStatus(orderStatus.VendorStatus) + if orderStatus.Status == 0 { + orderStatus.Status = c.getStatusFromVendorStatus(orderStatus.VendorStatus) + } return orderStatus } diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 2c545854b..ab6ca39a7 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -34,6 +34,9 @@ var ( jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel, jdapi.OrderStatusLocked: model.OrderStatusLocked, jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked, + + jdapi.OrderStatusVenderAgreeCancel: model.OrderStatusVendorAgreeCancel, + jdapi.OrderStatusVenderRejectCancel: model.OrderStatusVendorRejectCancel, } deliveryTypeMap = map[int]string{ jdapi.CarrierNoCrowdSourcing: model.OrderDeliveryTypePlatform, diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 4064fbb26..9fff31790 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -152,7 +152,7 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, outJxOrder.OrderID = GenOrderNo(ctx) order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress) if err = err2; err == nil { - order.Status = model.OrderStatusCreated + order.Status = model.OrderStatusWait4Pay callNewOrder(order) } } @@ -556,7 +556,7 @@ func AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgre if isAgree { err = CancelOrder(ctx, order, reason) } else { - err = changeOrderStatus(order.VendorOrderID, model.OrderStatusUndoApplyCancel, reason) + err = changeOrderStatus(order.VendorOrderID, model.OrderStatusVendorRejectCancel, reason) } return err } diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 9cc8fe70d..37ac17b84 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -65,7 +65,7 @@ var ( fakeFinishedPickup: model.OrderStatusFinishedPickup, fakeOrderAdjustFinished: model.OrderStatusAdjust, - fakeRefuseUserApplyCancel: model.OrderStatusUnlocked, + fakeRefuseUserApplyCancel: model.OrderStatusVendorRejectCancel, fakeUserApplyCancel: model.OrderStatusApplyCancel, fakeUserUndoApplyCancel: model.OrderStatusUndoApplyCancel, fakeMerchantAgreeApplyCancel: model.OrderStatusCanceled, From 169efcaa928f8cd55f3ea4f59e73b2aaa506331a Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 17 Dec 2019 18:24:56 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E7=BB=93=E6=9D=9F=E7=8A=B6=E6=80=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/misc/misc.go | 2 +- business/model/dao/act.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index b8c88480a..7f51a3b3c 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -132,7 +132,7 @@ func Init() { act.RefreshPageActs(jxcontext.AdminCtx, []int{model.VendorIDEBAI}, time.Now().Add(-30*24*time.Hour), false) }, refreshPageActTimeList) ScheduleTimerFunc("UpdateActStatusByTime", func() { - dao.UpdateActStatusByTime(dao.GetDB(), time.Now().Add(-48*time.Hour)) + dao.UpdateActStatusByTime(dao.GetDB(), time.Now()) }, updateActStatusTimeList) ScheduleScoreStore() ScheduleCheckStoreAlert() diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 8e3db3c8c..90907be70 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -436,7 +436,7 @@ func UpdateActStatusByTime(db *DaoDB, refTime time.Time) (num int64, err error) model.ActStatusEnded, utils.DefaultTimeValue, model.ActStatusCanceled, - refTime, + utils.Time2Date(refTime), } num, err = ExecuteSQL(db, sql, sqlParams...) return num, err From fc039600d5682929df0ab68a6de4e0bc2b9cf541 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 18 Dec 2019 08:30:32 +0800 Subject: [PATCH 5/5] =?UTF-8?q?DeleteSkusFromAct=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8F=AF=E9=80=89=E5=8F=82=E6=95=B0types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 5 ++--- controllers/act.go | 6 ++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 32875944e..c94a354d6 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -890,16 +890,15 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T return hint, err } -func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { +func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, actTypes, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { db := dao.GetDB() actMap := make(map[int]*model.Act) for _, skuID := range skuIDs { - pagedInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, []int{model.ActStatusCreated}, []int{model.ActSkuDirectDown, model.ActSkuSecKill}, nil, 0, skuID, 0, + pagedInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, []int{model.ActStatusCreated}, actTypes, nil, 0, skuID, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, time.Now().Add(-24*30*3*time.Hour), utils.DefaultTimeValue) if err = err2; err != nil { return "", err } - // globals.SugarLogger.Debug(utils.Format4Output(pagedInfo, false)) for _, v := range pagedInfo.Data { actMap[v.Act.ID] = &v.Act } diff --git a/controllers/act.go b/controllers/act.go index d1f88fb30..21cc12fdd 100644 --- a/controllers/act.go +++ b/controllers/act.go @@ -287,6 +287,7 @@ func (c *ActController) RefreshPageActs() { // @Param token header string true "认证token" // @Param skuIDs query string true "skuID列表" // @Param vendorID query int true "厂商ID" +// @Param types query string false "活动类型列表" // @Param isAsync query bool false "是否异步" // @Param isContinueWhenError query bool false "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult @@ -295,8 +296,9 @@ func (c *ActController) RefreshPageActs() { func (c *ActController) DeleteSkusFromAct() { c.callDeleteSkusFromAct(func(params *tActDeleteSkusFromActParams) (retVal interface{}, errCode string, err error) { var skuIDs []int - if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs); err == nil { - retVal, err = act.DeleteSkusFromAct(params.Ctx, params.VendorID, skuIDs, params.IsAsync, params.IsContinueWhenError) + var types []int + if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs, params.Types, &types); err == nil { + retVal, err = act.DeleteSkusFromAct(params.Ctx, params.VendorID, types, skuIDs, params.IsAsync, params.IsContinueWhenError) } return retVal, "", err })