diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 435d57902..d68d9d828 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -242,13 +242,28 @@ func (v *VendorSync) SyncStore(ctx *jxcontext.Context, db *dao.DaoDB, vendorID, } func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) { - globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameID:%d, skuID:%d, userName:%s", ctx.GetTrackInfo(), nameID, skuID, userName) - return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameID:%d, skuID:%d", nameID, skuID), isAsync, userName, + var ( + nameIDs []int + skuIDs []int + ) + if nameID != -1 { + nameIDs = []int{nameID} + } + if skuID != -1 { + skuIDs = []int{skuID} + } + return v.SyncSkus(ctx, db, nameIDs, skuIDs, isAsync, isContinueWhenError, userName) +} + +func (v *VendorSync) SyncSkus(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) + return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { vendorID := batchItemList[0].(int) multiStoresHandler := v.GetMultiStoreHandler(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 @@ -256,14 +271,23 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI WHERE t1.%s_sync_status <> 0 `, dbField) sqlParams := []interface{}{} - if nameID != -1 { - sql += " AND t1.name_id = ?" - sqlParams = append(sqlParams, nameID) + if len(nameIDs) > 1 { + sql += " AND t1.name_id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } else if len(nameIDs) == 1 { + sql += " AND t1.name_id = ? " + sqlParams = append(sqlParams, nameIDs[0]) } - if skuID != -1 { - sql += " AND t1.id = ?" - sqlParams = append(sqlParams, skuID) + if len(skuIDs) > 0 { + sql += " AND t1.id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } else if len(skuIDs) == 1 { + sql += " AND t1.id = ? " + sqlParams = append(sqlParams, skuIDs[0]) + } + for _, v := range skuIDs { + skuMap[v] = true } sql += " ORDER BY t2.id" @@ -284,7 +308,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI for _, sku := range skuList { syncStatus := refutil.GetObjFieldByName(sku, syncStatusFieldName).(int8) globals.SugarLogger.Debugf("SyncSku trackInfo:%s, skuID:%d, syncStatus:%d", ctx.GetTrackInfo(), sku.ID, syncStatus) - if (skuID == -1 || skuID == sku.ID) && (syncStatus != 0) { + if (len(skuIDs) == 0 || skuMap[sku.ID]) && (syncStatus != 0) { updateFields := []string{syncStatusFieldName} if syncStatus&model.SyncFlagDeletedMask != 0 { // 删除 if syncStatus&model.SyncFlagNewMask == 0 { @@ -543,3 +567,25 @@ func isSyncError(err error) bool { _, ok := err.(*SyncError) return ok } + +func (v *VendorSync) ForceSyncSkuNames(ctx *jxcontext.Context, nameIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { + sql := ` + UPDATE sku t1 + SET t1.jd_sync_status = t1.jd_sync_status | ? + WHERE t1.deleted_at = ? + ` + sqlParams := []interface{}{ + model.SyncFlagModifiedMask, + utils.DefaultTimeValue, + } + if len(nameIDs) > 0 { + sql += " AND t1.name_id IN(" + dao.GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + + db := dao.GetDB() + if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { + return "", err + } + return v.SyncSkus(ctx, db, nameIDs, nil, isAsync, isContinueWhenError, ctx.GetUserName()) +} diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 948c4dfe2..6b5e59a17 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -139,3 +139,22 @@ func (c *SyncController) DeleteRemoteStoreSkus() { return retVal, "", err }) } + +// @Title 强制同步SKU(多门店平台) +// @Description 强制同步SKU(多门店平台) +// @Param token header string true "认证token" +// @Param nameIDs formData string false "name ID列表" +// @Param isAsync formData bool false "是否异步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /ForceSyncSkuNames [put] +func (c *SyncController) ForceSyncSkuNames() { + c.callForceSyncSkuNames(func(params *tSyncForceSyncSkuNamesParams) (retVal interface{}, errCode string, err error) { + var nameIDs []int + if err = jxutils.Strings2Objs(params.NameIDs, &nameIDs); err == nil { + retVal, err = cms.CurVendorSync.ForceSyncSkuNames(params.Ctx, nameIDs, params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 863386ef2..b30c0d722 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1213,6 +1213,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], + beego.ControllerComments{ + Method: "ForceSyncSkuNames", + Router: `/ForceSyncSkuNames`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], beego.ControllerComments{ Method: "FullSyncStoresSkus",