diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 2b46ead77..97a763f20 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -246,41 +246,50 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI cond[model.FieldID] = skuID } err := dao.GetEntitiesByKV(db, &skuList, cond, true) - if err == nil && len(skuList) > 0 { - sort.Sort(jxutils.SkuList(skuList)) - // globals.SugarLogger.Debug(utils.Format4Output(skuList, false)) - // todo 这里SetParallelCount(1)的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 - task := tasksch.NewParallelTask("SyncSku loop sku", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { - sku := batchItemList[0].(*model.Sku) - syncStatus := jxutils.GetObjFieldByName(sku, syncStatusFieldName).(int8) - if (skuID == -1 || skuID == sku.ID) && (syncStatus != 0) { - updateFields := []string{syncStatusFieldName} - if syncStatus&model.SyncFlagDeletedMask != 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 { - jxutils.SetObjFieldByName(sku, syncStatusFieldName, int8(0)) - dao.UpdateEntity(db, sku, updateFields...) - } + if err == nil { + var dirtySkuList []*model.Sku + for _, v := range skuList { + syncStatus := jxutils.GetObjFieldByName(v, syncStatusFieldName).(int8) + if syncStatus != 0 { + dirtySkuList = append(dirtySkuList, v) } - return nil, err - }, skuList) - t.AddChild(task).Run() - _, err = task.GetResult(0) + } + if len(dirtySkuList) > 0 { + sort.Sort(jxutils.SkuList(dirtySkuList)) + // globals.SugarLogger.Debug(utils.Format4Output(dirtySkuList, false)) + // todo 这里SetParallelCount(1)的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 + task := tasksch.NewParallelTask("SyncSku loop sku", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { + sku := batchItemList[0].(*model.Sku) + syncStatus := jxutils.GetObjFieldByName(sku, syncStatusFieldName).(int8) + if (skuID == -1 || skuID == sku.ID) && (syncStatus != 0) { + updateFields := []string{syncStatusFieldName} + if syncStatus&model.SyncFlagDeletedMask != 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 { + jxutils.SetObjFieldByName(sku, syncStatusFieldName, int8(0)) + dao.UpdateEntity(db, sku, updateFields...) + } + } + return nil, err + }, dirtySkuList) + t.AddChild(task).Run() + _, err = task.GetResult(0) + } } return nil, err })