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/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/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/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/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
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/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/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/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go
index c57a99aa3..429cad174 100644
--- a/business/partner/purchase/ebai/store_sku2.go
+++ b/business/partner/purchase/ebai/store_sku2.go
@@ -315,7 +315,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) {
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/jd/sku.go b/business/partner/purchase/jd/sku.go
index 23030971a..5643a4c7b 100644
--- a/business/partner/purchase/jd/sku.go
+++ b/business/partner/purchase/jd/sku.go
@@ -2,501 +2,479 @@ package jd
// 这里函数取得的信息,除了与自身实体相关的ID(比如PARENT ID),都已经转换成了本地ID了
-import (
- "fmt"
- "time"
- "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 := ""
- if skuInfoExt.ExPrefixEnd != utils.ZeroTimeValue && skuInfoExt.ExPrefixBegin != utils.ZeroTimeValue {
- if time.Now().Before(skuInfoExt.ExPrefixEnd) && time.Now().After(skuInfoExt.ExPrefixBegin) {
- skuName = skuInfoExt.ExPrefix + jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
- } else {
- skuName = jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
- }
- } else {
- 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/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/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
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,
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
})