diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index f383f8da6..b9dbf19e5 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -4,6 +4,7 @@ import ( "fmt" "math" "strings" + "sync" "time" "git.rosy.net.cn/baseapi/platformapi/jdapi" @@ -645,3 +646,121 @@ func CreateOrderFromOriginal(ctx *jxcontext.Context, isAsync, isContinueWhenErro } return hint, err } + +func TransformJdSpu2Sku(ctx *jxcontext.Context, skuNameIDs []int, count int, isAsync, isContinueWhenError bool) (hint string, err error) { + sql := ` + SELECT t1.* + FROM sku_name t1 + WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.is_spu = 1 + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + model.SkuStatusDeleted, + } + if len(skuNameIDs) > 0 { + sql += " AND t1.id IN (" + dao.GenQuestionMarks(len(skuNameIDs)) + ")" + sqlParams = append(sqlParams, skuNameIDs) + } + sql += " ORDER BY t1.id" + if count > 0 { + sql += " LIMIT ?" + sqlParams = append(sqlParams, count) + } + db := dao.GetDB() + var skuNameList []*model.SkuName + if err = dao.GetRows(db, &skuNameList, sql, sqlParams...); err != nil { + return "", err + } + if len(skuNameList) == 0 { + return "", fmt.Errorf("待转换的skuName为空") + } + batchSize := 40 + rootTask := tasksch.NewSeqTask("TransformJdSpu2Sku", ctx.GetUserName(), func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + var ( + locker sync.Mutex + skuIDs []int + ) + lastIndex := (step + 1) * batchSize + if lastIndex > len(skuNameList) { + lastIndex = len(skuNameList) + } + batchSkNameList := skuNameList[step*batchSize : lastIndex] + subTask := tasksch.NewParallelTask(fmt.Sprintf("TransformJdSpu2Sku:%d", step), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx.GetUserName(), func(subTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + skuName := batchItemList[0].(*model.SkuName) + if true { //!jxutils.IsFakeID(skuName.JdID) { + sql = ` + SELECT * + FROM sku + WHERE name_id = ? AND deleted_at = ? AND status <> ?; + ` + sqlParams := []interface{}{ + skuName.ID, + utils.DefaultTimeValue, + model.SkuStatusDeleted, + } + var skuList []*model.Sku + if err = dao.GetRows(db, &skuList, sql, sqlParams...); err != nil { + return "", err + } + globals.SugarLogger.Debugf("TransformJdSpu2Sku skuList:%s", utils.Format4Output(skuList, false)) + if len(skuList) > 0 { + for _, sku := range skuList { + locker.Lock() + skuIDs = append(skuIDs, sku.ID) + locker.Unlock() + if !jxutils.IsFakeID(sku.JdID) { + if globals.EnableStoreWrite { + if err = api.JdAPI.UpdateSkuBaseInfo(utils.Int2Str(skuName.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)); err != nil { + break + } + } + } + } + } + if err == nil && globals.EnableStoreWrite { + if err = api.JdAPI.UpdateSpu(utils.Int2Str(skuName.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil { + err = api.JdAPI.UpdateSpu(utils.Int2Str(skuName.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)) + } + } + if err == nil { + skuName.IsSpu = 0 + if _, err = dao.UpdateEntity(db, skuName, "IsSpu"); err == nil { + sql := ` + UPDATE sku t1 + SET + t1.jd_sync_status = ?, + t1.jd_id = 0 + WHERE t1.name_id = ? AND t1.deleted_at = ? AND t1.status <> ? + ` + sqlParams := []interface{}{ + model.SyncFlagNewMask, + skuName.ID, + utils.DefaultTimeValue, + model.SkuStatusDeleted, + } + if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err == nil { + _, err = cms.CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, isContinueWhenError, ctx.GetUserName()) + } + } + } + } + return nil, err + }, batchSkNameList) + rootTask.AddChild(subTask).Run() + if _, err = subTask.GetResult(0); err == nil { + if len(skuIDs) > 0 { + if _, err = dao.SetStoreSkuSyncStatus(db, model.VendorIDJD, -1, skuIDs, model.SyncFlagModifiedMask|model.SyncFlagPriceMask|model.SyncFlagSaleMask); err == nil { + _, err = cms.CurVendorSync.SyncStoresSkus(ctx, db, []int{model.VendorIDJD}, nil, skuIDs, false, isContinueWhenError) + } + } + } + return nil, err + }, (len(skuNameList)-1)/batchSize+1) + tasksch.ManageTask(rootTask).Run() + if !isAsync { + _, err = rootTask.GetResult(0) + } else { + hint = rootTask.ID + } + return hint, err +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index bcc4f27fe..70228f65b 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -201,12 +201,15 @@ func SetStoreSkuSyncStatus(db *DaoDB, vendorID, storeID int, skuIDs []int, syncS sql := fmt.Sprintf(` UPDATE store_sku_bind SET %s_sync_status = %s_sync_status | ? - WHERE deleted_at = ? AND store_id = ? + WHERE deleted_at = ? `, fieldPrefix, fieldPrefix) sqlParams := []interface{}{ syncStatus, utils.DefaultTimeValue, - storeID, + } + if storeID > 0 { + sql += " AND store_id = ?" + sqlParams = append(sqlParams, storeID) } if len(skuIDs) > 0 { sql += " AND sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" diff --git a/controllers/temp_op.go b/controllers/temp_op.go index e7dde60e5..f2f26dfe3 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -106,3 +106,24 @@ func (c *InitDataController) DeleteWrongSpu() { return retVal, "", err }) } + +// @Title 将京东的SPU转为非SPU,保持转后的SKU商家自编号不变 +// @Description 将京东的SPU转为非SPU,保持转后的SKU商家自编号不变 +// @Param token header string true "认证token" +// @Param nameIDs formData string false "需要转换的nameID列表,缺省空表示全部" +// @Param count formData int false "转换的数量,缺省0表示全部(按ID排序)" +// @Param isAsync formData bool false "是否异步操作" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /TransformJdSpu2Sku [post] +func (c *InitDataController) TransformJdSpu2Sku() { + c.callTransformJdSpu2Sku(func(params *tInitdataTransformJdSpu2SkuParams) (retVal interface{}, errCode string, err error) { + var nameIDs []int + if err = jxutils.Strings2Objs(params.NameIDs, &nameIDs); err != nil { + return retVal, "", err + } + retVal, err = tempop.TransformJdSpu2Sku(params.Ctx, nameIDs, params.Count, params.IsAsync, params.IsContinueWhenError) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 8ef8a3425..0a965e269 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -255,6 +255,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], + beego.ControllerComments{ + Method: "TransformJdSpu2Sku", + Router: `/TransformJdSpu2Sku`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], beego.ControllerComments{ Method: "UploadWeimobImg4SkuName",