diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 69bb3ca00..307832df8 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -101,8 +101,8 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string } dao.WrapAddIDCULDEntity(cat, userName) - cat.JdSyncStatus = model.SyncFlagNewMask - cat.JdID = 0 + // cat.JdSyncStatus = model.SyncFlagNewMask + // cat.JdID = 0 cat.Status = model.CategoryStatusEnable cat.Name = strings.Trim(cat.Name, " ") if cat.Img != "" { @@ -152,12 +152,12 @@ func UpdateCategory(ctx *jxcontext.Context, categoryID int, payload map[string]i } valid := dao.StrictMakeMapByStructObject(payload, cat, userName) if len(valid) > 0 { - syncStatus := 0 - if valid["name"] != nil { - valid["name"] = strings.Trim(valid["name"].(string), " ") - syncStatus = model.SyncFlagModifiedMask - valid[model.FieldJdSyncStatus] = int8(syncStatus) | cat.JdSyncStatus - } + // syncStatus := 0 + // if valid["name"] != nil { + // valid["name"] = strings.Trim(valid["name"].(string), " ") + // syncStatus = model.SyncFlagModifiedMask + // valid[model.FieldJdSyncStatus] = int8(syncStatus) | cat.JdSyncStatus + // } if valid["status"] != nil { if utils.Interface2Int64WithDefault(valid["status"], -1) == model.CategoryStatusDisabled { if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 { @@ -336,7 +336,10 @@ func DeleteCategory(ctx *jxcontext.Context, categoryID int, userName string) (nu dao.Rollback(db) return 0, err } - if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err != nil { + if num, err = dao.DeleteEntityLogically(db, cat, map[string]interface{}{ + // model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldStatus: 0, + }, userName, nil); err != nil { dao.Rollback(db) return 0, err } @@ -441,8 +444,13 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma return nil, err } if len(vendorSkuIDs) > 0 { - sql += " AND t2.jd_id IN (" + dao.GenQuestionMarks(len(vendorSkuIDs)) + ")" - sqlParams = append(sqlParams, vendorSkuIDs) + if globals.IsUseThingMap { + sql += " AND (SELECT COUNT(*) FROM thing_map tm WHERE tm.thing_type = ? AND tm.thing_id = t2.id AND tm.deleted_at = ? AND tm.vendor_thing_id IN (" + dao.GenQuestionMarks(len(vendorSkuIDs)) + ")) > 0" + sqlParams = append(sqlParams, utils.DefaultTimeValue, vendorSkuIDs) + } else { + sql += " AND t2.jd_id IN (" + dao.GenQuestionMarks(len(vendorSkuIDs)) + ")" + sqlParams = append(sqlParams, vendorSkuIDs) + } } } if params["name"] != nil { @@ -552,16 +560,18 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma t1.is_spu, t1.desc_img, t1.upc, + /* t1.jd_id, t1.jd_sync_status, + */ t1.ex_prefix, t1.ex_prefix_begin, t1.ex_prefix_end, CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, - '","weight":', t2.weight, ',"jdID":', t2.jd_id, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, - ',"jdID":', t2.jd_id, ',"jdSyncStatus":', t2.jd_sync_status, ', "seq":', t2.seq, + '","weight":', t2.weight, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, + ', "seq":', t2.seq, "}")), "]") skus_str, CONCAT("[", GROUP_CONCAT(DISTINCT t3.place_code), "]") places_str ` + sql + ` @@ -670,7 +680,7 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s skuNameExt.SkuName.Status = model.SkuStatusNormal if skuNameExt.IsSpu == 1 { return nil, fmt.Errorf("不允许创建多规格商品") - skuNameExt.SkuName.JdSyncStatus = model.SyncFlagNewMask + // skuNameExt.SkuName.JdSyncStatus = model.SyncFlagNewMask } if skuNameExt.Unit == model.SpecialUnit { skuNameExt.SpecQuality = float32(model.SpecialSpecQuality) @@ -727,8 +737,8 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s sku := v.Sku dao.WrapAddIDCULDEntity(sku, userName) sku.NameID = skuNameExt.ID - sku.JdSyncStatus = model.SyncFlagNewMask - sku.JdID = 0 + // sku.JdSyncStatus = model.SyncFlagNewMask + // sku.JdID = 0 if err = dao.CreateEntity(db, sku); err != nil { dao.Rollback(db) return nil, err @@ -822,7 +832,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf panic(r) } }() - valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus + // valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err != nil { dao.Rollback(db) return 0, err @@ -855,7 +865,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf if err = err2; err == nil { for _, v := range skuList { sku := &v.Sku - sku.JdSyncStatus |= model.SyncFlagModifiedMask + // sku.JdSyncStatus |= model.SyncFlagModifiedMask sku.LastOperator = userName sku.UpdatedAt = time.Now() if _, err = dao.UpdateEntity(db, sku); err != nil { @@ -930,8 +940,8 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int return 0, err } if _, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ - model.FieldJdSyncStatus: model.SyncFlagDeletedMask, - model.FieldStatus: model.SkuStatusDeleted, + // model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldStatus: model.SkuStatusDeleted, }, userName, nil); err != nil { dao.Rollback(db) return 0, err @@ -947,8 +957,8 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int skuName := &model.SkuName{} skuName.ID = nameID if num, err = dao.DeleteEntityLogically(db, skuName, map[string]interface{}{ - model.FieldJdSyncStatus: model.SyncFlagDeletedMask, - model.FieldStatus: model.SkuStatusDeleted, + // model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldStatus: model.SkuStatusDeleted, }, userName, nil); err != nil { dao.Rollback(db) return 0, err @@ -973,8 +983,8 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string) } dao.WrapAddIDCULDEntity(sku, userName) - sku.JdSyncStatus = model.SyncFlagNewMask - sku.JdID = 0 + // sku.JdSyncStatus = model.SyncFlagNewMask + // sku.JdID = 0 sku.NameID = nameID dao.Begin(db) @@ -1028,7 +1038,7 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} if valid["specQuality"] != nil || valid["specUnit"] != nil { maskValue |= model.SyncFlagSpecMask } - valid[model.FieldJdSyncStatus] = maskValue | sku.JdSyncStatus + // valid[model.FieldJdSyncStatus] = maskValue | sku.JdSyncStatus if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err != nil || num == 0 { dao.Rollback(db) if err == nil { @@ -1121,8 +1131,8 @@ func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, e sku := &model.Sku{} sku.ID = skuID if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ - model.FieldStatus: model.SkuStatusDeleted, - model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldStatus: model.SkuStatusDeleted, + // model.FieldJdSyncStatus: model.SyncFlagDeletedMask, }, userName, nil); err != nil { dao.Rollback(db) return 0, err diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 667a60b0f..e9bbcebce 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -277,8 +277,15 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike) if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { - sql += " OR t1.id = ? OR t2.id = ? OR t2.jd_id = ?" - sqlParams = append(sqlParams, keywordInt64, keywordInt64, keywordInt64) + sql += " OR t1.id = ? OR t2.id = ?" + sqlParams = append(sqlParams, keywordInt64, keywordInt64) + if !globals.IsUseThingMap { + sql += " OR t2.jd_id = ?" + sqlParams = append(sqlParams, keywordInt64) + } else { + sql += " OR (SELECT COUNT(*) FROM thing_map tm WHERE tm.vendor_org_code = sm.vendor_org_code AND tm.thing_type = ? AND tm.thing_id = t2.id AND tm.deleted_at = ? AND tm.vendor_thing_id = ?) > 0" + sqlParams = append(sqlParams, model.ThingTypeSku, utils.DefaultTimeValue, keywordInt64) + } if isFocus { sql += " OR t4.ebai_id = ? OR t4.mtwm_id = ?" sqlParams = append(sqlParams, keywordInt64, keywordInt64) diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 03a7fc223..c4adde26d 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -379,23 +379,23 @@ func OnThingSync(ctx *jxcontext.Context, db *dao.DaoDB, thingMap *model.ThingMap } func updateThingMapEntity(db *dao.DaoDB, thingMap *model.ThingMap) { - if thingMap.VendorOrgCode == globals.JdOrgCode { - if thingMap.ThingType == model.ThingTypeCategory { - cat := &model.SkuCategory{ - JdID: utils.Str2Int64WithDefault(thingMap.VendorThingID, 0), - JdSyncStatus: thingMap.SyncStatus, - } - cat.ID = int(thingMap.ThingID) - dao.UpdateEntity(db, cat, "JdID", "JdSyncStatus") - } else if thingMap.ThingType == model.ThingTypeSku { - sku := &model.Sku{ - JdID: utils.Str2Int64WithDefault(thingMap.VendorThingID, 0), - JdSyncStatus: thingMap.SyncStatus, - } - sku.ID = int(thingMap.ThingID) - dao.UpdateEntity(db, sku, "JdID", "JdSyncStatus") - } - } + // if thingMap.VendorOrgCode == globals.JdOrgCode { + // if thingMap.ThingType == model.ThingTypeCategory { + // cat := &model.SkuCategory{ + // JdID: utils.Str2Int64WithDefault(thingMap.VendorThingID, 0), + // JdSyncStatus: thingMap.SyncStatus, + // } + // cat.ID = int(thingMap.ThingID) + // dao.UpdateEntity(db, cat, "JdID", "JdSyncStatus") + // } else if thingMap.ThingType == model.ThingTypeSku { + // sku := &model.Sku{ + // JdID: utils.Str2Int64WithDefault(thingMap.VendorThingID, 0), + // JdSyncStatus: thingMap.SyncStatus, + // } + // sku.ID = int(thingMap.ThingID) + // dao.UpdateEntity(db, sku, "JdID", "JdSyncStatus") + // } + // } } func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) { diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 8909c63bd..afd9ca273 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -6,7 +6,6 @@ import ( "fmt" "regexp" "strings" - "sync" "time" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" @@ -40,252 +39,252 @@ func init() { } func Convert2JDSPU(ctx *jxcontext.Context, count int, isAsync, isContinueWhenError bool) (hint string, err error) { - sql := ` - SELECT t1.* - FROM sku_name t1 - LEFT JOIN sku_name t2 ON t2.link_id = t1.id AND t2.deleted_at = ? - WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.is_spu = 0/* AND t1.unit = '份'*/ - AND t2.id IS NULL - ORDER BY t1.id - ` - if count > 0 { - sql += " LIMIT " + utils.Int2Str(count) - } - sqlParams := []interface{}{ - utils.DefaultTimeValue, - utils.DefaultTimeValue, - model.SkuStatusDeleted, - } + // sql := ` + // SELECT t1.* + // FROM sku_name t1 + // LEFT JOIN sku_name t2 ON t2.link_id = t1.id AND t2.deleted_at = ? + // WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.is_spu = 0/* AND t1.unit = '份'*/ + // AND t2.id IS NULL + // ORDER BY t1.id + // ` + // if count > 0 { + // sql += " LIMIT " + utils.Int2Str(count) + // } + // sqlParams := []interface{}{ + // utils.DefaultTimeValue, + // utils.DefaultTimeValue, + // model.SkuStatusDeleted, + // } - db := dao.GetDB() - var skuNameList []*model.SkuName - if err = dao.GetRows(db, &skuNameList, sql, sqlParams...); err != nil { - return "", err - } - for _, skuName := range skuNameList { - sql = ` - SELECT * - FROM sku - WHERE name_id = ? AND deleted_at = ? AND status = ?; - ` - sqlParams := []interface{}{ - skuName.ID, - utils.DefaultTimeValue, - model.SkuStatusNormal, - } - var skuList []*model.Sku - if err = dao.GetRows(db, &skuList, sql, sqlParams...); err != nil { - return "", err - } + // db := dao.GetDB() + // var skuNameList []*model.SkuName + // if err = dao.GetRows(db, &skuNameList, sql, sqlParams...); err != nil { + // return "", err + // } + // for _, skuName := range skuNameList { + // sql = ` + // SELECT * + // FROM sku + // WHERE name_id = ? AND deleted_at = ? AND status = ?; + // ` + // sqlParams := []interface{}{ + // skuName.ID, + // utils.DefaultTimeValue, + // model.SkuStatusNormal, + // } + // var skuList []*model.Sku + // if err = dao.GetRows(db, &skuList, sql, sqlParams...); err != nil { + // return "", err + // } - sql = ` - SELECT t1.* - FROM sku_name_place_bind t1 - WHERE t1.name_id = ? - ` - sqlParams = []interface{}{ - skuName.ID, - } - var skuNamePlaceBindList []*model.SkuNamePlaceBind - if err = dao.GetRows(db, &skuNamePlaceBindList, sql, sqlParams...); err != nil { - return "", err - } + // sql = ` + // SELECT t1.* + // FROM sku_name_place_bind t1 + // WHERE t1.name_id = ? + // ` + // sqlParams = []interface{}{ + // skuName.ID, + // } + // var skuNamePlaceBindList []*model.SkuNamePlaceBind + // if err = dao.GetRows(db, &skuNamePlaceBindList, sql, sqlParams...); err != nil { + // return "", err + // } - globals.SugarLogger.Debugf("Convert2JDSPU, skuName:%s, skuCount:%d", skuName.Name, len(skuList)) - dao.Begin(db) - skuNameNew2 := *skuName - skuNameNew := &skuNameNew2 - dao.WrapAddIDCULEntity(skuNameNew, ctx.GetUserName()) - skuNameNew.JdID = 0 - skuNameNew.LinkID = skuName.ID - skuNameNew.IsSpu = 1 - skuNameNew.JdSyncStatus = model.SyncFlagNewMask - // skuNameNew.Status = model.SkuStatusDontSale - if err = dao.CreateEntity(db, skuNameNew); err != nil { - dao.Rollback(db) - return "", err - } - if len(skuList) > 0 { - for _, sku := range skuList { - skuNew2 := *sku - skuNew := &skuNew2 - dao.WrapAddIDCULEntity(skuNew, ctx.GetUserName()) - skuNew.JdID = 0 - skuNew.LinkID = sku.ID - skuNew.NameID = skuNameNew.ID - skuNew.JdSyncStatus = model.SyncFlagNewMask - if skuNameNew.Status == model.SkuStatusDontSale { - skuNew.Status = model.SkuStatusDontSale - } - globals.SugarLogger.Debugf("Convert2JDSPU, sku:%s", utils.Format4Output(skuNew, false)) - if err = dao.CreateEntity(db, skuNew); err != nil { - dao.Rollback(db) - return "", err - } - } - for _, placeBind := range skuNamePlaceBindList { - dao.WrapAddIDCULEntity(placeBind, ctx.GetUserName()) - placeBind.NameID = skuNameNew.ID - globals.SugarLogger.Debugf("Convert2JDSPU, placeBind:%s", utils.Format4Output(placeBind, false)) - if err = dao.CreateEntity(db, placeBind); err != nil { - dao.Rollback(db) - return "", err - } - } - } - dao.Commit(db) - } - sql = ` - SELECT DISTINCT t1.* - FROM sku_name t1 - JOIN sku t2 ON t1.id = t2.name_id AND t2.jd_sync_status <> 0 AND t2.deleted_at = ? - WHERE t1.link_id > 0; - ` - skuNameList = []*model.SkuName{} - if err = dao.GetRows(db, &skuNameList, sql, utils.DefaultTimeValue); err != nil { - return "", err - } - rootTask := tasksch.NewParallelTask("Convert2JDSPU", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - skuName := batchItemList[0].(*model.SkuName) - _, err = cms.CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, isContinueWhenError, ctx.GetUserName()) - return nil, err - }, skuNameList) - tasksch.ManageTask(rootTask).Run() + // globals.SugarLogger.Debugf("Convert2JDSPU, skuName:%s, skuCount:%d", skuName.Name, len(skuList)) + // dao.Begin(db) + // skuNameNew2 := *skuName + // skuNameNew := &skuNameNew2 + // dao.WrapAddIDCULEntity(skuNameNew, ctx.GetUserName()) + // skuNameNew.JdID = 0 + // skuNameNew.LinkID = skuName.ID + // skuNameNew.IsSpu = 1 + // skuNameNew.JdSyncStatus = model.SyncFlagNewMask + // // skuNameNew.Status = model.SkuStatusDontSale + // if err = dao.CreateEntity(db, skuNameNew); err != nil { + // dao.Rollback(db) + // return "", err + // } + // if len(skuList) > 0 { + // for _, sku := range skuList { + // skuNew2 := *sku + // skuNew := &skuNew2 + // dao.WrapAddIDCULEntity(skuNew, ctx.GetUserName()) + // skuNew.JdID = 0 + // skuNew.LinkID = sku.ID + // skuNew.NameID = skuNameNew.ID + // skuNew.JdSyncStatus = model.SyncFlagNewMask + // if skuNameNew.Status == model.SkuStatusDontSale { + // skuNew.Status = model.SkuStatusDontSale + // } + // globals.SugarLogger.Debugf("Convert2JDSPU, sku:%s", utils.Format4Output(skuNew, false)) + // if err = dao.CreateEntity(db, skuNew); err != nil { + // dao.Rollback(db) + // return "", err + // } + // } + // for _, placeBind := range skuNamePlaceBindList { + // dao.WrapAddIDCULEntity(placeBind, ctx.GetUserName()) + // placeBind.NameID = skuNameNew.ID + // globals.SugarLogger.Debugf("Convert2JDSPU, placeBind:%s", utils.Format4Output(placeBind, false)) + // if err = dao.CreateEntity(db, placeBind); err != nil { + // dao.Rollback(db) + // return "", err + // } + // } + // } + // dao.Commit(db) + // } + // sql = ` + // SELECT DISTINCT t1.* + // FROM sku_name t1 + // JOIN sku t2 ON t1.id = t2.name_id AND t2.jd_sync_status <> 0 AND t2.deleted_at = ? + // WHERE t1.link_id > 0; + // ` + // skuNameList = []*model.SkuName{} + // if err = dao.GetRows(db, &skuNameList, sql, utils.DefaultTimeValue); err != nil { + // return "", err + // } + // rootTask := tasksch.NewParallelTask("Convert2JDSPU", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // skuName := batchItemList[0].(*model.SkuName) + // _, err = cms.CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, isContinueWhenError, ctx.GetUserName()) + // return nil, err + // }, skuNameList) + // tasksch.ManageTask(rootTask).Run() - if !isAsync { - _, err = rootTask.GetResult(0) - } else { - hint = rootTask.ID - } + // if !isAsync { + // _, err = rootTask.GetResult(0) + // } else { + // hint = rootTask.ID + // } return hint, err } func Change2JDSPU4Store(ctx *jxcontext.Context, storeIDs []int, step int, isAsync, isContinueWhenError bool) (hint string, err error) { - db := dao.GetDB() - if len(storeIDs) == 0 { - if err = dao.GetRows(db, &storeIDs, ` - SELECT t1.id - FROM store t1 - JOIN store_map t2 ON t2.store_id = t1.id AND t2.vendor_id = 0 AND t2.deleted_at = ? AND t2.status <> ? - WHERE t1.deleted_at = ? AND t1.status <> ? /* AND t1.city_code IN (110100, 120100, 440100, 440300, 510100)*/ - `, utils.DefaultTimeValue, model.StoreStatusDisabled, utils.DefaultTimeValue, model.StoreStatusDisabled); err != nil { - return "", err - } - } - var sql string - var sqlParams []interface{} + // db := dao.GetDB() + // if len(storeIDs) == 0 { + // if err = dao.GetRows(db, &storeIDs, ` + // SELECT t1.id + // FROM store t1 + // JOIN store_map t2 ON t2.store_id = t1.id AND t2.vendor_id = 0 AND t2.deleted_at = ? AND t2.status <> ? + // WHERE t1.deleted_at = ? AND t1.status <> ? /* AND t1.city_code IN (110100, 120100, 440100, 440300, 510100)*/ + // `, utils.DefaultTimeValue, model.StoreStatusDisabled, utils.DefaultTimeValue, model.StoreStatusDisabled); err != nil { + // return "", err + // } + // } + // var sql string + // var sqlParams []interface{} - dao.Begin(db) - defer dao.Rollback(db) + // dao.Begin(db) + // defer dao.Rollback(db) - if step == 1 { - sql = ` - DELETE t1 - FROM store_sku_bind t1 - JOIN sku t2 ON t2.id = t1.sku_id AND t2.link_id > 0 - WHERE 1 = 1 - ` - sqlParams = []interface{}{} - if len(storeIDs) > 0 { - sql += " AND store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { - return "", err - } + // if step == 1 { + // sql = ` + // DELETE t1 + // FROM store_sku_bind t1 + // JOIN sku t2 ON t2.id = t1.sku_id AND t2.link_id > 0 + // WHERE 1 = 1 + // ` + // sqlParams = []interface{}{} + // if len(storeIDs) > 0 { + // sql += " AND store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" + // sqlParams = append(sqlParams, storeIDs) + // } + // if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { + // return "", err + // } - sql = ` - INSERT INTO store_sku_bind(created_at, updated_at, last_operator, deleted_at, store_id, sku_id, price, unit_price, status, ebai_id, mtwm_id, jd_sync_status, ebai_sync_status, mtwm_sync_status) - SELECT NOW(), NOW(), ?, ?, t1.store_id, t2.id, t1.price, t1.unit_price, t1.status , 0, 0, ?, ?, ? - FROM store_sku_bind t1 - JOIN sku t2 ON t2.link_id = t1.sku_id AND t2.deleted_at = ? - JOIN store t3 ON t3.id = t1.store_id - JOIN sku_name t4 ON t4.id = t2.name_id - LEFT JOIN sku_name_place_bind t5 ON t5.place_code = t3.city_code AND t5.name_id = t4.id - WHERE t1.deleted_at = ? AND (t4.is_global = 1 OR t5.id IS NOT NULL) AND t1.price > 0 - ` - sqlParams = []interface{}{ - ctx.GetUserName(), - utils.DefaultTimeValue, - // model.SkuStatusDontSale, - model.SyncFlagNewMask, - 0, //model.SyncFlagNewMask, - 0, //model.SyncFlagNewMask, - utils.DefaultTimeValue, - utils.DefaultTimeValue, - } - } else if step == 2 { - sql = ` - SELECT COUNT(*) ct - FROM store_sku_bind t1 - JOIN sku t2 ON t2.id = t1.sku_id AND t2.link_id > 0 - WHERE 1 = 1 - ` - sqlParams = []interface{}{} - if len(storeIDs) > 0 { - sql += " AND store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - ct := 0 - if err = dao.GetRow(db, &ct, sql, sqlParams...); err != nil { - return "", err - } - if ct == 0 { - return "", fmt.Errorf("%s看起来还没有执行《将转化的SPU在门店上架》", utils.Format4Output(storeIDs, true)) - } + // sql = ` + // INSERT INTO store_sku_bind(created_at, updated_at, last_operator, deleted_at, store_id, sku_id, price, unit_price, status, ebai_id, mtwm_id, jd_sync_status, ebai_sync_status, mtwm_sync_status) + // SELECT NOW(), NOW(), ?, ?, t1.store_id, t2.id, t1.price, t1.unit_price, t1.status , 0, 0, ?, ?, ? + // FROM store_sku_bind t1 + // JOIN sku t2 ON t2.link_id = t1.sku_id AND t2.deleted_at = ? + // JOIN store t3 ON t3.id = t1.store_id + // JOIN sku_name t4 ON t4.id = t2.name_id + // LEFT JOIN sku_name_place_bind t5 ON t5.place_code = t3.city_code AND t5.name_id = t4.id + // WHERE t1.deleted_at = ? AND (t4.is_global = 1 OR t5.id IS NOT NULL) AND t1.price > 0 + // ` + // sqlParams = []interface{}{ + // ctx.GetUserName(), + // utils.DefaultTimeValue, + // // model.SkuStatusDontSale, + // model.SyncFlagNewMask, + // 0, //model.SyncFlagNewMask, + // 0, //model.SyncFlagNewMask, + // utils.DefaultTimeValue, + // utils.DefaultTimeValue, + // } + // } else if step == 2 { + // sql = ` + // SELECT COUNT(*) ct + // FROM store_sku_bind t1 + // JOIN sku t2 ON t2.id = t1.sku_id AND t2.link_id > 0 + // WHERE 1 = 1 + // ` + // sqlParams = []interface{}{} + // if len(storeIDs) > 0 { + // sql += " AND store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" + // sqlParams = append(sqlParams, storeIDs) + // } + // ct := 0 + // if err = dao.GetRow(db, &ct, sql, sqlParams...); err != nil { + // return "", err + // } + // if ct == 0 { + // return "", fmt.Errorf("%s看起来还没有执行《将转化的SPU在门店上架》", utils.Format4Output(storeIDs, true)) + // } - sql = ` - UPDATE store_sku_bind t1 - JOIN sku t2 ON t2.link_id = t1.sku_id - SET t1.status = 0, - t1.jd_sync_status = ? - WHERE t1.deleted_at = ? - ` - sqlParams = []interface{}{ - model.SyncFlagSaleMask | model.SyncFlagModifiedMask, - utils.DefaultTimeValue, - } - } else { - return "", fmt.Errorf("非法的step") - } - if len(storeIDs) > 0 { - sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - globals.SugarLogger.Debug(sql) - globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) - var num int64 - if num, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { - return "", err - } - globals.SugarLogger.Debug(num) - dao.Commit(db) + // sql = ` + // UPDATE store_sku_bind t1 + // JOIN sku t2 ON t2.link_id = t1.sku_id + // SET t1.status = 0, + // t1.jd_sync_status = ? + // WHERE t1.deleted_at = ? + // ` + // sqlParams = []interface{}{ + // model.SyncFlagSaleMask | model.SyncFlagModifiedMask, + // utils.DefaultTimeValue, + // } + // } else { + // return "", fmt.Errorf("非法的step") + // } + // if len(storeIDs) > 0 { + // sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" + // sqlParams = append(sqlParams, storeIDs) + // } + // globals.SugarLogger.Debug(sql) + // globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) + // var num int64 + // if num, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { + // return "", err + // } + // globals.SugarLogger.Debug(num) + // dao.Commit(db) - var skuIDs []int - if step == 1 { - sql = ` - SELECT id - FROM sku t1 - WHERE t1.link_id > 0 AND t1.deleted_at = ? - ` - sqlParams = []interface{}{ - utils.DefaultTimeValue, - } - } else if step == 2 { - sql = ` - SELECT t1.link_id - FROM sku t1 - WHERE t1.link_id > 0 AND t1.deleted_at = ? - ` - sqlParams = []interface{}{ - utils.DefaultTimeValue, - } - } - if err = dao.GetRows(db, &skuIDs, sql, sqlParams...); err != nil { - return "", err - } - hint, err = cms.CurVendorSync.SyncStoresSkus(ctx, db, []int{model.VendorIDJD}, storeIDs, skuIDs, false, isAsync, isContinueWhenError) + // var skuIDs []int + // if step == 1 { + // sql = ` + // SELECT id + // FROM sku t1 + // WHERE t1.link_id > 0 AND t1.deleted_at = ? + // ` + // sqlParams = []interface{}{ + // utils.DefaultTimeValue, + // } + // } else if step == 2 { + // sql = ` + // SELECT t1.link_id + // FROM sku t1 + // WHERE t1.link_id > 0 AND t1.deleted_at = ? + // ` + // sqlParams = []interface{}{ + // utils.DefaultTimeValue, + // } + // } + // if err = dao.GetRows(db, &skuIDs, sql, sqlParams...); err != nil { + // return "", err + // } + // hint, err = cms.CurVendorSync.SyncStoresSkus(ctx, db, []int{model.VendorIDJD}, storeIDs, skuIDs, false, isAsync, isContinueWhenError) return hint, err } @@ -600,132 +599,132 @@ type GoodsOrderOriginalEx struct { } 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 AND jd_id <> 0 - ` - 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.NewSeqTask2("TransformJdSpu2Sku", ctx, isContinueWhenError, - 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, - func(subTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - skuName := batchItemList[0].(*model.SkuName) - if !jxutils.IsEmptyID(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.IsEmptyID(sku.JdID) { - if globals.EnableJdStoreWrite { - if err = api.JdAPI.UpdateSkuBaseInfo(utils.Int2Str(skuName.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)); err != nil { - if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 11004 { - err = nil - } else { - break - } - } - } - } - } - } - if err == nil && globals.EnableJdStoreWrite { - 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)) - } else if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 11035 { - err = nil - } - } - if err == nil { - skuName.IsSpu = 0 - skuName.JdID = 0 - if _, err = dao.UpdateEntity(db, skuName, "IsSpu", "JdID"); 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()) - } - } - } - } else { - globals.SugarLogger.Debugf("TransformJdSpu2Sku skuName:%d is fake", skuName.ID) - } - 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, nil, skuIDs, model.SyncFlagStoreSkuModifiedMask); err == nil { - // time.Sleep(20 * time.Second) - // _, 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 - } + // sql := ` + // SELECT t1.* + // FROM sku_name t1 + // WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.is_spu = 1 AND jd_id <> 0 + // ` + // 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.NewSeqTask2("TransformJdSpu2Sku", ctx, isContinueWhenError, + // 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, + // func(subTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // skuName := batchItemList[0].(*model.SkuName) + // if !jxutils.IsEmptyID(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.IsEmptyID(sku.JdID) { + // if globals.EnableJdStoreWrite { + // if err = api.JdAPI.UpdateSkuBaseInfo(utils.Int2Str(skuName.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)); err != nil { + // if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 11004 { + // err = nil + // } else { + // break + // } + // } + // } + // } + // } + // } + // if err == nil && globals.EnableJdStoreWrite { + // 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)) + // } else if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 11035 { + // err = nil + // } + // } + // if err == nil { + // skuName.IsSpu = 0 + // skuName.JdID = 0 + // if _, err = dao.UpdateEntity(db, skuName, "IsSpu", "JdID"); 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()) + // } + // } + // } + // } else { + // globals.SugarLogger.Debugf("TransformJdSpu2Sku skuName:%d is fake", skuName.ID) + // } + // 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, nil, skuIDs, model.SyncFlagStoreSkuModifiedMask); err == nil { + // // time.Sleep(20 * time.Second) + // // _, 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 } @@ -1383,7 +1382,7 @@ func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, i Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))), Status: model.SkuStatusNormal, - LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用 + SkuIndex: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用 }, } if sku["enabled"].(string) == "0" { @@ -1449,8 +1448,7 @@ func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, i if cat.Name == "进口水果" { jdCatID = 20342 // 其他进口水果 } - price := sku.LinkID - sku.LinkID = 0 + price := sku.SkuIndex skuName := jxutils.ComposeSkuNameOriginal(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) fixedStatus := 1 if sku.Status != model.SkuStatusNormal { diff --git a/business/model/model.go b/business/model/model.go index d37c43b69..584c5bf01 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -27,7 +27,7 @@ const ( FieldCategoryID = "CategoryID" - FieldJdID = "JdID" + // FieldJdID = "JdID" // FieldElmID = "ElmID" FieldEbaiID = "EbaiID" FieldMtwmID = "MtwmID" diff --git a/business/model/sku.go b/business/model/sku.go index 2fcdb1d40..f7f013323 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -148,10 +148,10 @@ type SkuCategory struct { // ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别 // WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别 - Status int8 `orm:"default(1)" json:"status"` //分类状态,0表示禁用,1表示启用 - Img string `orm:"size(512)" json:"img"` //分类图片 - JdID int64 `orm:"column(jd_id)" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID - JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` + Status int8 `orm:"default(1)" json:"status"` //分类状态,0表示禁用,1表示启用 + Img string `orm:"size(512)" json:"img"` //分类图片 + // JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID + // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` } func (*SkuCategory) TableUnique() [][]string { @@ -160,12 +160,6 @@ func (*SkuCategory) TableUnique() [][]string { } } -func (*SkuCategory) TableIndex() [][]string { - return [][]string{ - []string{"JdID", "DeletedAt"}, - } -} - type SkuName struct { ModelIDCULD @@ -198,10 +192,10 @@ type SkuName struct { Status int `orm:"default(1)" json:"status"` // skuname状态,取值同sku.Status IsSpu int8 `orm:"column(is_spu)" json:"isSpu"` // 用于指明是否SKUNAME当成SPU - JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` - JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` + // JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` + // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` - LinkID int `orm:"column(link_id);null;index" json:"linkID"` + // LinkID int `orm:"column(link_id);null;index" json:"linkID"` } func (*SkuName) TableUnique() [][]string { @@ -220,19 +214,19 @@ func (*SkuName) TableIndex() [][]string { type Sku struct { ModelIDCULD - CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别 - NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一 - SkuIndex int `json:"-"` - Comment string `orm:"size(255)" json:"comment"` - SpecQuality float32 `json:"specQuality"` - SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量 - Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality - Status int `json:"status"` - Seq int `json:"seq"` - JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` - JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` + CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别 + NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一 + SkuIndex int `json:"-"` + Comment string `orm:"size(255)" json:"comment"` + SpecQuality float32 `json:"specQuality"` + SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量 + Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality + Status int `json:"status"` + Seq int `json:"seq"` + // JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` + // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` - LinkID int `orm:"column(link_id);null;index" json:"linkID"` + // LinkID int `orm:"column(link_id);null;index" json:"linkID"` } type SkuAndName struct {