Merge remote-tracking branch 'origin/mark' into yonghui
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/datares"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
@@ -97,10 +98,25 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string
|
||||
}
|
||||
cat.Seq = maxSeq.MaxSeq + 1
|
||||
}
|
||||
if err = dao.CreateEntity(nil, cat); err == nil {
|
||||
outCat = cat
|
||||
_, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName)
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
if err = dao.CreateEntity(db, cat); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
if err = OnCreateThing(db, int64(cat.ID), model.ThingTypeCategory); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
outCat = cat
|
||||
|
||||
_, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName)
|
||||
return outCat, err
|
||||
}
|
||||
|
||||
@@ -119,64 +135,71 @@ func UpdateCategory(ctx *jxcontext.Context, categoryID int, payload map[string]i
|
||||
syncStatus = model.SyncFlagModifiedMask
|
||||
valid[model.FieldJdSyncStatus] = int8(syncStatus) | cat.JdSyncStatus
|
||||
}
|
||||
if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err == nil {
|
||||
SetStoreCategorySyncStatus2(db, nil, []int{categoryID}, model.SyncFlagModifiedMask)
|
||||
var skuIDs []int
|
||||
if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil ||
|
||||
valid["jdPricePercentage"] != nil || valid["ebaiPricePercentage"] != nil || valid["mtwmPricePercentage"] != nil {
|
||||
if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 {
|
||||
for _, sku := range skuList {
|
||||
skuIDs = append(skuIDs, sku.ID)
|
||||
}
|
||||
if valid["jdCategoryID"] != nil {
|
||||
dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask)
|
||||
}
|
||||
|
||||
// todo 如下逻辑,在不同平台同时改pricePercentage与平台分类映射时,会不必要的打上多余的标记
|
||||
var vendorIDs []int
|
||||
syncStatus := model.SyncFlagModifiedMask
|
||||
if valid["jdPricePercentage"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDJD)
|
||||
syncStatus |= model.SyncFlagPriceMask
|
||||
}
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if err = OnUpdateThing(db, int64(categoryID), model.ThingTypeCategory); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
if valid["ebaiPricePercentage"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDEBAI)
|
||||
syncStatus |= model.SyncFlagPriceMask
|
||||
} else if valid["ebaiCategoryID"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDEBAI)
|
||||
}
|
||||
SetStoreCategorySyncStatus2(db, nil, []int{categoryID}, model.SyncFlagModifiedMask)
|
||||
var skuIDs []int
|
||||
if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil ||
|
||||
valid["jdPricePercentage"] != nil || valid["ebaiPricePercentage"] != nil || valid["mtwmPricePercentage"] != nil {
|
||||
if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 {
|
||||
for _, sku := range skuList {
|
||||
skuIDs = append(skuIDs, sku.ID)
|
||||
}
|
||||
if valid["jdCategoryID"] != nil {
|
||||
dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask)
|
||||
}
|
||||
|
||||
if valid["mtwmPricePercentage"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDMTWM)
|
||||
syncStatus |= model.SyncFlagPriceMask
|
||||
} else if valid["mtwmCategoryID"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDMTWM)
|
||||
}
|
||||
if len(vendorIDs) > 0 {
|
||||
SetStoreSkuSyncStatus2(db, nil, vendorIDs, skuIDs, syncStatus)
|
||||
}
|
||||
// todo 如下逻辑,在不同平台同时改pricePercentage与平台分类映射时,会不必要的打上多余的标记
|
||||
var vendorIDs []int
|
||||
syncStatus := model.SyncFlagModifiedMask
|
||||
if valid["jdPricePercentage"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDJD)
|
||||
syncStatus |= model.SyncFlagPriceMask
|
||||
}
|
||||
|
||||
if valid["ebaiPricePercentage"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDEBAI)
|
||||
syncStatus |= model.SyncFlagPriceMask
|
||||
} else if valid["ebaiCategoryID"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDEBAI)
|
||||
}
|
||||
|
||||
if valid["mtwmPricePercentage"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDMTWM)
|
||||
syncStatus |= model.SyncFlagPriceMask
|
||||
} else if valid["mtwmCategoryID"] != nil {
|
||||
vendorIDs = append(vendorIDs, model.VendorIDMTWM)
|
||||
}
|
||||
if len(vendorIDs) > 0 {
|
||||
SetStoreSkuSyncStatus2(db, nil, vendorIDs, skuIDs, syncStatus)
|
||||
}
|
||||
}
|
||||
_, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName)
|
||||
if len(skuIDs) > 0 {
|
||||
CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, userName)
|
||||
}
|
||||
}
|
||||
_, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName)
|
||||
if len(skuIDs) > 0 {
|
||||
CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, userName)
|
||||
}
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, syncStatus int) (num int64, err error) {
|
||||
// dao.Begin(db)
|
||||
// defer func() {
|
||||
// if r := recover(); r != nil || err != nil {
|
||||
// dao.Rollback(db)
|
||||
// if r != nil {
|
||||
// panic(r)
|
||||
// }
|
||||
// }
|
||||
// }()
|
||||
for _, vendorID := range partner.GetSingleStoreVendorIDs() {
|
||||
num2, err2 := dao.SetStoreCategorySyncStatus(db, vendorID, storeIDs, catIDs, syncStatus)
|
||||
if err = err2; err != nil {
|
||||
@@ -184,43 +207,52 @@ func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, sy
|
||||
}
|
||||
num += num2
|
||||
}
|
||||
// dao.Commit(db)
|
||||
return num, nil
|
||||
}
|
||||
|
||||
func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int, userName string) (err error) {
|
||||
var cats []*model.SkuCategory
|
||||
parentCat := &model.SkuCategory{}
|
||||
parentCat.ID = parentID
|
||||
db := dao.GetDB()
|
||||
if parentID != 0 {
|
||||
err = dao.GetEntity(db, parentCat)
|
||||
} else {
|
||||
parentCat = nil
|
||||
}
|
||||
if err == nil {
|
||||
if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil {
|
||||
catsLen := len(cats)
|
||||
if catsLen != len(categoryIDs) {
|
||||
return ErrInputCatsDoesntMatch
|
||||
if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil {
|
||||
catsLen := len(cats)
|
||||
if catsLen != len(categoryIDs) {
|
||||
return ErrInputCatsDoesntMatch
|
||||
}
|
||||
catsMap := make(map[int]*model.SkuCategory, catsLen)
|
||||
for _, cat := range cats {
|
||||
catsMap[cat.ID] = cat
|
||||
}
|
||||
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
catsMap := make(map[int]*model.SkuCategory, catsLen)
|
||||
for _, cat := range cats {
|
||||
catsMap[cat.ID] = cat
|
||||
}()
|
||||
for k, v := range categoryIDs {
|
||||
if catsMap[v] == nil {
|
||||
dao.Rollback(db)
|
||||
return fmt.Errorf("分类:%d不在%d分类下", v, parentID)
|
||||
}
|
||||
for k, v := range categoryIDs {
|
||||
catsMap[v].Seq = k
|
||||
catsMap[v].LastOperator = ctx.GetUserName()
|
||||
if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil {
|
||||
break
|
||||
}
|
||||
catsMap[v].Seq = k
|
||||
catsMap[v].LastOperator = ctx.GetUserName()
|
||||
if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil {
|
||||
dao.Rollback(db)
|
||||
return err
|
||||
}
|
||||
SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask)
|
||||
if err == nil {
|
||||
_, err = CurVendorSync.SyncReorderCategories(ctx, db, parentID, false, userName)
|
||||
CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true)
|
||||
if err = OnUpdateThing(db, int64(catsMap[v].ID), model.ThingTypeCategory); err != nil {
|
||||
dao.Rollback(db)
|
||||
return err
|
||||
}
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask)
|
||||
if err == nil {
|
||||
_, err = CurVendorSync.SyncReorderCategories(ctx, db, parentID, false, userName)
|
||||
CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -252,14 +284,25 @@ func DeleteCategory(ctx *jxcontext.Context, categoryID int, userName string) (nu
|
||||
}
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
dao.Rollback(db)
|
||||
}()
|
||||
if _, err = DeleteCategoryMap(ctx, db, categoryID); err == nil {
|
||||
if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err == nil && num == 1 {
|
||||
dao.Commit(db)
|
||||
_, err = CurVendorSync.SyncCategory(ctx, db, cat.ID, false, userName)
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
if _, err = DeleteCategoryMap(ctx, db, categoryID); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if err = OnDeleteThing(db, int64(categoryID), model.ThingTypeCategory); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
_, err = CurVendorSync.SyncCategory(ctx, db, cat.ID, false, userName)
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
@@ -620,11 +663,15 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
if err = OnCreateThing(db, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
for _, sku := range skuNameExt.Skus {
|
||||
dao.WrapAddIDCULDEntity(sku, userName)
|
||||
sku.NameID = skuNameExt.ID
|
||||
sku.JdSyncStatus = model.SyncFlagNewMask
|
||||
sku.JdID = 0 //beginJDID
|
||||
sku.JdID = 0
|
||||
if err = dao.CreateEntity(db, sku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
@@ -728,66 +775,77 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
||||
}
|
||||
}()
|
||||
valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus
|
||||
if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err == nil {
|
||||
if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil {
|
||||
if places, ok := payload["places"].([]interface{}); ok {
|
||||
if _, err = dao.DeleteSkuNamePlace(db, nameID, nil); err == nil {
|
||||
for _, placeCode := range places {
|
||||
placeBind := &model.SkuNamePlaceBind{}
|
||||
placeBind.PlaceCode = int(utils.Interface2Int64WithDefault(placeCode, 0))
|
||||
if placeBind.PlaceCode > 0 {
|
||||
dao.WrapAddIDCULEntity(placeBind, userName)
|
||||
placeBind.NameID = nameID
|
||||
err = dao.CreateEntity(db, placeBind)
|
||||
} else {
|
||||
dao.Rollback(db)
|
||||
return 0, errors.New("地点代码非法")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil)
|
||||
if err = err2; err == nil {
|
||||
for _, v := range skuList {
|
||||
sku := &v.Sku
|
||||
sku.JdSyncStatus |= model.SyncFlagModifiedMask
|
||||
sku.LastOperator = userName
|
||||
sku.UpdatedAt = time.Now()
|
||||
dao.UpdateEntity(db, sku)
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID})
|
||||
if err = err2; err == nil && len(skuIDs) > 0 {
|
||||
_, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), skuIDs, model.SyncFlagModifiedMask)
|
||||
}
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
dao.Commit(db)
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
|
||||
} else {
|
||||
dao.Rollback(db)
|
||||
}
|
||||
} else {
|
||||
if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil {
|
||||
if places, ok := payload["places"].([]interface{}); ok {
|
||||
if _, err = dao.DeleteSkuNamePlace(db, nameID, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
for _, placeCode := range places {
|
||||
placeBind := &model.SkuNamePlaceBind{}
|
||||
placeBind.PlaceCode = int(utils.Interface2Int64WithDefault(placeCode, 0))
|
||||
if placeBind.PlaceCode > 0 {
|
||||
dao.WrapAddIDCULEntity(placeBind, userName)
|
||||
placeBind.NameID = nameID
|
||||
err = dao.CreateEntity(db, placeBind)
|
||||
} else {
|
||||
dao.Rollback(db)
|
||||
return 0, errors.New("地点代码非法")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil)
|
||||
if err = err2; err == nil {
|
||||
for _, v := range skuList {
|
||||
sku := &v.Sku
|
||||
sku.JdSyncStatus |= model.SyncFlagModifiedMask
|
||||
sku.LastOperator = userName
|
||||
sku.UpdatedAt = time.Now()
|
||||
if _, err = dao.UpdateEntity(db, sku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if err = OnUpdateThing(db, int64(v.ID), model.ThingTypeSku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID})
|
||||
if err = err2; err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if len(skuIDs) > 0 {
|
||||
if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), skuIDs, model.SyncFlagModifiedMask); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
errList := errlist.New()
|
||||
errList.AddErr(err)
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
|
||||
errList.AddErr(err)
|
||||
err = errList.GetErrListAsOne()
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []int, syncStatus int) (num int64, err error) {
|
||||
// dao.Begin(db)
|
||||
// defer func() {
|
||||
// if r := recover(); r != nil || err != nil {
|
||||
// dao.Rollback(db)
|
||||
// if r != nil {
|
||||
// panic(r)
|
||||
// }
|
||||
// }
|
||||
// }()
|
||||
for _, vendorID := range vendorIDs {
|
||||
num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeIDs, skuIDs, syncStatus)
|
||||
if err = err2; err != nil {
|
||||
@@ -795,7 +853,6 @@ func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []i
|
||||
}
|
||||
num += num2
|
||||
}
|
||||
// dao.Commit(db)
|
||||
return num, nil
|
||||
}
|
||||
|
||||
@@ -803,33 +860,57 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int
|
||||
db := dao.GetDB()
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
dao.Rollback(db)
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
|
||||
if _, err := dao.DeleteSkuNamePlace(db, nameID, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if _, err = DeleteStoreSku(ctx, db, nameID, 0); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
numSku, err := dao.DeleteEntityLogically(db, &model.Sku{}, map[string]interface{}{
|
||||
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
|
||||
model.FieldStatus: model.SkuStatusDeleted,
|
||||
}, userName, map[string]interface{}{
|
||||
model.FieldNameID: nameID,
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil)
|
||||
if err = err2; err == nil {
|
||||
for _, v := range skuList {
|
||||
sku := &v.Sku
|
||||
if _, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{
|
||||
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
|
||||
model.FieldStatus: model.SkuStatusDeleted,
|
||||
}, userName, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if err = OnDeleteThing(db, int64(v.ID), model.ThingTypeSku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err = OnDeleteThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
skuName := &model.SkuName{}
|
||||
skuName.ID = nameID
|
||||
if num, err = dao.DeleteEntityLogically(db, skuName, map[string]interface{}{
|
||||
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
|
||||
model.FieldStatus: model.SkuStatusDeleted,
|
||||
}, userName, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
if numSku > 0 {
|
||||
|
||||
if len(skuList) > 0 {
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, false, userName)
|
||||
}
|
||||
return num, err
|
||||
@@ -848,17 +929,33 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
|
||||
|
||||
dao.WrapAddIDCULDEntity(sku, userName)
|
||||
sku.JdSyncStatus = model.SyncFlagNewMask
|
||||
sku.NameID = nameID
|
||||
sku.JdID = 0
|
||||
if err = dao.CreateEntity(db, sku); err == nil {
|
||||
result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0)
|
||||
if err = err2; err == nil {
|
||||
if result.TotalCount == 1 {
|
||||
outSkuNameExt = result.SkuNames[0]
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, sku.ID, false, false, userName)
|
||||
} else {
|
||||
err = ErrEntityNotExist
|
||||
}
|
||||
sku.NameID = nameID
|
||||
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
if err = dao.CreateEntity(db, sku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
if err = OnCreateThing(db, int64(sku.ID), model.ThingTypeSku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0)
|
||||
if err = err2; err == nil {
|
||||
if result.TotalCount == 1 {
|
||||
outSkuNameExt = result.SkuNames[0]
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, sku.ID, false, false, userName)
|
||||
} else {
|
||||
err = ErrEntityNotExist
|
||||
}
|
||||
}
|
||||
return outSkuNameExt, err
|
||||
@@ -887,31 +984,43 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{}
|
||||
maskValue |= model.SyncFlagSpecMask
|
||||
}
|
||||
valid[model.FieldJdSyncStatus] = maskValue | sku.JdSyncStatus
|
||||
if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err == nil {
|
||||
if num == 1 {
|
||||
if num, err = dao.ExecuteSQL(db, `
|
||||
UPDATE sku_name t1
|
||||
JOIN sku t2 ON t1.id = t2.name_id
|
||||
SET t1.spec_quality = t2.spec_quality,
|
||||
t1.spec_unit = t2.spec_unit
|
||||
WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ?
|
||||
`, utils.DefaultTimeValue, skuID, model.SpecialUnit); err == nil {
|
||||
if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagModifiedMask); err == nil {
|
||||
if maskValue&model.SyncFlagSpecMask != 0 {
|
||||
err = refreshStoreSkuPrice(ctx, db, skuID)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err != nil || num == 0 {
|
||||
dao.Rollback(db)
|
||||
if err == nil {
|
||||
err = ErrEntityNotExist
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
if err == nil {
|
||||
dao.Commit(db)
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName)
|
||||
} else {
|
||||
if num, err = dao.ExecuteSQL(db, `
|
||||
UPDATE sku_name t1
|
||||
JOIN sku t2 ON t1.id = t2.name_id
|
||||
SET t1.spec_quality = t2.spec_quality,
|
||||
t1.spec_unit = t2.spec_unit
|
||||
WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ?
|
||||
`, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil || num == 0 {
|
||||
dao.Rollback(db)
|
||||
if err == nil {
|
||||
err = ErrEntityNotExist
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
if err = OnUpdateThing(db, int64(skuID), model.ThingTypeSku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagModifiedMask); err == nil {
|
||||
if maskValue&model.SyncFlagSpecMask != 0 {
|
||||
err = refreshStoreSkuPrice(ctx, db, skuID)
|
||||
}
|
||||
}
|
||||
|
||||
errList := errlist.New()
|
||||
errList.AddErr(err)
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName)
|
||||
errList.AddErr(err)
|
||||
err = errList.GetErrListAsOne()
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
@@ -950,23 +1059,33 @@ func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, e
|
||||
db := dao.GetDB()
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
dao.Rollback(db)
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
|
||||
if _, err = DeleteStoreSku(ctx, db, 0, skuID); err == nil {
|
||||
sku := &model.Sku{}
|
||||
sku.ID = skuID
|
||||
if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{
|
||||
model.FieldStatus: model.SkuStatusDeleted,
|
||||
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
|
||||
}, userName, nil); err == nil {
|
||||
dao.Commit(db)
|
||||
if num == 1 {
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName)
|
||||
} else {
|
||||
err = ErrEntityNotExist
|
||||
}
|
||||
}
|
||||
if _, err = DeleteStoreSku(ctx, db, 0, skuID); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
if err = OnDeleteThing(db, int64(skuID), model.ThingTypeSku); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
sku := &model.Sku{}
|
||||
sku.ID = skuID
|
||||
if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{
|
||||
model.FieldStatus: model.SkuStatusDeleted,
|
||||
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
|
||||
}, userName, nil); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
if num == 1 {
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName)
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
@@ -997,6 +1116,7 @@ func DeleteStoreSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int) (n
|
||||
storeSkuBind := &model.StoreSkuBind{}
|
||||
_, err = dao.DeleteEntityLogically(db, storeSkuBind, map[string]interface{}{
|
||||
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
|
||||
model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask,
|
||||
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
|
||||
}, ctx.GetUserName(), map[string]interface{}{
|
||||
model.FieldSkuID: v.ID,
|
||||
@@ -1017,9 +1137,25 @@ func AddSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName str
|
||||
PlaceCode: placeCode,
|
||||
}
|
||||
dao.WrapAddIDCULEntity(placeBind, userName)
|
||||
if err = dao.CreateEntity(db, placeBind); err == nil {
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
|
||||
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
if err = dao.CreateEntity(db, placeBind); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
|
||||
dao.Rollback(db)
|
||||
return nil, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
|
||||
return placeBind, err
|
||||
}
|
||||
|
||||
@@ -1028,13 +1164,28 @@ func DeleteSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName
|
||||
placeBind := &model.SkuNamePlaceBind{}
|
||||
placeBind.NameID = nameID
|
||||
placeBind.PlaceCode = placeCode
|
||||
if num, err = dao.DeleteEntity(db, placeBind, model.FieldNameID, model.FieldPlaceCode); err == nil {
|
||||
if num == 1 {
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
|
||||
} else {
|
||||
|
||||
dao.Begin(db)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
if num, err = dao.DeleteEntity(db, placeBind, model.FieldNameID, model.FieldPlaceCode); err != nil || num == 0 {
|
||||
dao.Rollback(db)
|
||||
if err == nil {
|
||||
err = ErrEntityNotExist
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
|
||||
dao.Rollback(db)
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
|
||||
return num, err
|
||||
}
|
||||
|
||||
@@ -1067,9 +1218,7 @@ func SortCategorySkus(ctx *jxcontext.Context, catID int, skuIDList []int) (err e
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
dao.Rollback(db)
|
||||
if r != nil {
|
||||
panic(r)
|
||||
}
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
nameIDList := []int{}
|
||||
@@ -1096,6 +1245,5 @@ func SortCategorySkus(ctx *jxcontext.Context, catID int, skuIDList []int) (err e
|
||||
dao.Rollback(db)
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -38,6 +38,11 @@ type SingleStoreHandlerWrapper struct {
|
||||
partner.ISingleStoreHandler
|
||||
}
|
||||
|
||||
type tMultiStoreVendorInfo struct {
|
||||
VendorID int
|
||||
OrgCode string
|
||||
}
|
||||
|
||||
var (
|
||||
CurVendorSync VendorSync
|
||||
)
|
||||
@@ -96,6 +101,20 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan
|
||||
return nil
|
||||
}
|
||||
|
||||
func getMultiStoreVendorInfoList() (list []*tMultiStoreVendorInfo) {
|
||||
vendorIDs := partner.GetMultiStoreVendorIDs()
|
||||
for _, vendorID := range vendorIDs {
|
||||
orgCodeList := partner.CurAPIManager.GetAppOrgCodeList(vendorID)
|
||||
for _, v := range orgCodeList {
|
||||
list = append(list, &tMultiStoreVendorInfo{
|
||||
VendorID: vendorID,
|
||||
OrgCode: v,
|
||||
})
|
||||
}
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
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])
|
||||
@@ -132,7 +151,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
|
||||
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) {
|
||||
vendorID := batchItemList[0].(int)
|
||||
vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo)
|
||||
var cats []*model.SkuCategory
|
||||
cond := make(map[string]interface{})
|
||||
if categoryID > 0 {
|
||||
@@ -142,7 +161,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
|
||||
}
|
||||
err := dao.GetEntitiesByKV(db, &cats, cond, true)
|
||||
if err == nil {
|
||||
err = v.syncCategories(ctx, t, vendorID, db, cats, userName)
|
||||
err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName)
|
||||
}
|
||||
if err != nil || categoryID > 0 {
|
||||
return nil, err
|
||||
@@ -150,7 +169,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
|
||||
cond[model.FieldLevel] = 2
|
||||
err = dao.GetEntitiesByKV(db, &cats, cond, true)
|
||||
if err == nil {
|
||||
err = v.syncCategories(ctx, t, vendorID, db, cats, userName)
|
||||
err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName)
|
||||
}
|
||||
return nil, err
|
||||
})
|
||||
@@ -159,7 +178,8 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
|
||||
|
||||
func (v *VendorSync) SyncReorderCategories(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) {
|
||||
multiStoresHandler := v.GetMultiStoreHandler(batchItemList[0].(int))
|
||||
vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo)
|
||||
multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID)
|
||||
err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName)
|
||||
if err2 == nil {
|
||||
cat := &model.SkuCategory{}
|
||||
@@ -236,8 +256,8 @@ func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []i
|
||||
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{}
|
||||
vendorID := batchItemList[0].(int)
|
||||
multiStoresHandler := v.GetMultiStoreHandler(vendorID)
|
||||
vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo)
|
||||
multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID)
|
||||
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()])
|
||||
dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()])
|
||||
skuMap := make(map[int]bool)
|
||||
@@ -266,7 +286,7 @@ func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []i
|
||||
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[vendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
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)
|
||||
@@ -562,7 +582,7 @@ func (v *VendorSync) LoopStoresMap(ctx *jxcontext.Context, db *dao.DaoDB, taskNa
|
||||
}
|
||||
|
||||
func (v *VendorSync) LoopMultiStoresVendors(ctx *jxcontext.Context, db *dao.DaoDB, taskName string, isAsync bool, isManageIt bool, handler tasksch.WorkFunc) (hint string, err error) {
|
||||
task := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, partner.GetMultiStoreVendorIDs())
|
||||
task := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, getMultiStoreVendorInfoList())
|
||||
tasksch.HandleTask(task, nil, isManageIt).Run()
|
||||
if !isAsync {
|
||||
result, err2 := task.GetResult(0)
|
||||
@@ -695,3 +715,15 @@ func GetTimeMixByInt(begin1, end1, begin2, end2 int16) (beginAt, endAt int16) {
|
||||
}
|
||||
return beginAt, endAt
|
||||
}
|
||||
|
||||
func OnCreateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func OnUpdateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func OnDeleteThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
package initdata
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
||||
"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/jxutils/datares"
|
||||
@@ -16,10 +12,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"github.com/qiniu/api.v7/storage"
|
||||
)
|
||||
|
||||
func TruncateTable(db *dao.DaoDB, tableName string) (err error) {
|
||||
@@ -142,107 +135,6 @@ func InitPlace(ctx *jxcontext.Context) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func RefreshSkuNameImg(ctx *jxcontext.Context, parentTask tasksch.ITask, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
db := dao.GetDB()
|
||||
var skuNameList []*model.SkuName
|
||||
if err = dao.GetRows(db, &skuNameList, `
|
||||
SELECT t1.id, t1.img, MAX(t2.jd_id) jd_id
|
||||
FROM sku_name t1
|
||||
JOIN sku t2 ON t2.name_id = t1.id AND t2.deleted_at = ?
|
||||
WHERE t1.deleted_at = ?
|
||||
GROUP BY 1,2
|
||||
ORDER BY t1.id
|
||||
`, utils.DefaultTimeValue, utils.DefaultTimeValue); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
task := tasksch.NewParallelTask("RefreshSkuNameImg", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
skuName := batchItemList[0].(*model.SkuName)
|
||||
if !jxutils.IsEmptyID(skuName.JdID) {
|
||||
if skuName.Img == "" || isForce {
|
||||
var imgList []*jdapi.SkuPageImg
|
||||
if imgList, err = api.JdAPI.GetSkuPageImageInfo(skuName.JdID); err == nil {
|
||||
if len(imgList) > 0 {
|
||||
skuName.Img = imgList[0].Big
|
||||
_, err = dao.UpdateEntity(db, skuName, "Img")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}, skuNameList)
|
||||
tasksch.HandleTask(task, parentTask, true).Run()
|
||||
if !isAsync {
|
||||
_, err = task.GetResult(0)
|
||||
} else {
|
||||
hint = task.ID
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
// func RefreshImgMd5(ctx *jxcontext.Context, parentTask tasksch.ITask, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
// db := dao.GetDB()
|
||||
// var skuNameList []*model.SkuName
|
||||
// if err = dao.GetRows(db, &skuNameList, `
|
||||
// SELECT *
|
||||
// FROM sku_name
|
||||
// WHERE deleted_at = ? AND img <> ''
|
||||
// ORDER BY id
|
||||
// `, utils.DefaultTimeValue); err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
|
||||
// task := tasksch.NewParallelTask("InitSkuName calculate md5", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// skuName := batchItemList[0].(*model.SkuName)
|
||||
// if skuName.ImgHashCode == "" || isForce {
|
||||
// response, err := http.Get(skuName.Img)
|
||||
// if err == nil {
|
||||
// defer response.Body.Close()
|
||||
// if response.StatusCode == http.StatusOK {
|
||||
// data, err2 := ioutil.ReadAll(response.Body)
|
||||
// if err = err2; err == nil {
|
||||
// skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data))
|
||||
// db := dao.GetDB()
|
||||
// _, err = dao.UpdateEntity(db, skuName, "ImgHashCode")
|
||||
// }
|
||||
// } else {
|
||||
// err = platformapi.ErrHTTPCodeIsNot200
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return nil, err
|
||||
// }, skuNameList)
|
||||
// tasksch.HandleTask(task, parentTask, true).Run()
|
||||
// if !isAsync {
|
||||
// _, err = task.GetResult(0)
|
||||
// } else {
|
||||
// hint = task.ID
|
||||
// }
|
||||
// return hint, err
|
||||
// }
|
||||
|
||||
func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
rootTask := tasksch.NewSeqTask("InitSkuName", ctx,
|
||||
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
switch step {
|
||||
case 0:
|
||||
_, err = RefreshSkuNameImg(ctx, task, isForce, false, isContinueWhenError)
|
||||
case 1:
|
||||
// _, err = RefreshImgMd5(ctx, task, isForce, false, isContinueWhenError)
|
||||
}
|
||||
return nil, err
|
||||
}, 2)
|
||||
tasksch.ManageTask(rootTask).Run()
|
||||
if !isAsync {
|
||||
_, err = rootTask.GetResult(0)
|
||||
} else {
|
||||
hint = rootTask.ID
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hint string, err error) {
|
||||
if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil {
|
||||
var cats []*model.SkuVendorCategory
|
||||
@@ -386,213 +278,3 @@ func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool
|
||||
func getSkuNameKey(prefix, name, comment, specUnit, unit string, specQuality float32) string {
|
||||
return fmt.Sprintf("%s-%s-%f-%s-%s", prefix, name, specQuality, specUnit, unit)
|
||||
}
|
||||
|
||||
func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
ebaiCatIDKey := "ebaiCatID"
|
||||
catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID)
|
||||
if err != nil {
|
||||
return hint, err
|
||||
}
|
||||
catMap := make(map[string]map[string]interface{})
|
||||
|
||||
allSkuInfo := make(map[string]map[string]map[string]map[string]interface{})
|
||||
for _, cat := range catList {
|
||||
catName := utils.Interface2String(cat["cat_name"])
|
||||
if catName == "限时特惠" || catName == "应季热销" {
|
||||
catName = "应季水果"
|
||||
}
|
||||
skuNameMap := allSkuInfo[catName]
|
||||
if skuNameMap == nil {
|
||||
skuNameMap = make(map[string]map[string]map[string]interface{})
|
||||
allSkuInfo[catName] = skuNameMap
|
||||
}
|
||||
if catMap[catName] == nil {
|
||||
catMap[catName] = cat
|
||||
}
|
||||
skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"])))
|
||||
if err = err2; err != nil {
|
||||
return hint, err
|
||||
}
|
||||
for _, sku := range skuList {
|
||||
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
|
||||
if specQuality > 0 {
|
||||
if catMap[catName][ebaiCatIDKey] == nil {
|
||||
catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"])
|
||||
}
|
||||
skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string)
|
||||
if skuNameMap[skuNameKey] == nil {
|
||||
skuNameMap[skuNameKey] = make(map[string]map[string]interface{})
|
||||
}
|
||||
skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku
|
||||
}
|
||||
}
|
||||
}
|
||||
allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt)
|
||||
catSeq := 0
|
||||
for catName, catSkuNameMap := range allSkuInfo {
|
||||
if len(catSkuNameMap) > 0 {
|
||||
skuCat := &model.SkuCategory{
|
||||
Name: catName,
|
||||
ParentID: 0,
|
||||
Level: 1,
|
||||
Type: model.SkuCategoryNormal,
|
||||
Seq: catSeq,
|
||||
EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])),
|
||||
}
|
||||
catSeq++
|
||||
for _, skuList := range catSkuNameMap {
|
||||
var skuNameExt *model.SkuNameExt
|
||||
for _, sku := range skuList {
|
||||
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
|
||||
if skuNameExt == nil {
|
||||
skuNameExt = &model.SkuNameExt{
|
||||
SkuName: model.SkuName{
|
||||
Prefix: prefix,
|
||||
Name: name,
|
||||
// CategoryID:
|
||||
IsGlobal: 1,
|
||||
Unit: unit,
|
||||
SpecQuality: specQuality,
|
||||
SpecUnit: specUnit,
|
||||
Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))),
|
||||
Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string),
|
||||
Status: model.SkuStatusNormal,
|
||||
IsSpu: 0,
|
||||
},
|
||||
}
|
||||
if len(skuList) > 1 {
|
||||
skuNameExt.Unit = "份"
|
||||
skuNameExt.SpecQuality = 500
|
||||
skuNameExt.SpecUnit = "g"
|
||||
}
|
||||
if skuNameExt.Unit == "份" {
|
||||
tmpSpecQuality := specQuality
|
||||
if specUnit == "kg" || specUnit == "l" {
|
||||
tmpSpecQuality *= 1000
|
||||
}
|
||||
skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality)
|
||||
}
|
||||
}
|
||||
mySku := &model.Sku{
|
||||
// CategoryID:
|
||||
// NameID:
|
||||
Comment: comment,
|
||||
SpecQuality: specQuality,
|
||||
SpecUnit: specUnit,
|
||||
Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))),
|
||||
Status: model.SkuStatusNormal,
|
||||
|
||||
LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用
|
||||
}
|
||||
if sku["enabled"].(string) == "0" {
|
||||
mySku.Status = model.SkuStatusDontSale
|
||||
}
|
||||
skuNameExt.Skus = append(skuNameExt.Skus, mySku)
|
||||
}
|
||||
allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startOutSkuID := 1000
|
||||
var skuCatList []*model.SkuCategory
|
||||
for cat := range allSkuInfo2 {
|
||||
skuCatList = append(skuCatList, cat)
|
||||
}
|
||||
putPolicy := storage.PutPolicy{
|
||||
Scope: globals.QiniuBucket,
|
||||
// Expires: 10 * 60,
|
||||
}
|
||||
cfg := &storage.Config{}
|
||||
upToken := putPolicy.UploadToken(api.QiniuAPI)
|
||||
rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx,
|
||||
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
var catID string
|
||||
cat := skuCatList[step]
|
||||
skuNameExtList := allSkuInfo2[cat]
|
||||
catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName())
|
||||
if err == nil {
|
||||
shopCategories := []int64{utils.Str2Int64(catID)}
|
||||
for _, skuNameExt := range skuNameExtList {
|
||||
var imgContent []byte
|
||||
skuNameExt.CategoryID = cat.ID
|
||||
skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1)
|
||||
if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil {
|
||||
globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err)
|
||||
if !isContinueWhenError {
|
||||
return nil, err
|
||||
}
|
||||
err = nil
|
||||
continue
|
||||
}
|
||||
formUploader := storage.NewFormUploader(cfg)
|
||||
ret := storage.PutRet{}
|
||||
key := jxutils.GenPicFileName(".jpeg")
|
||||
for i := 0; i < 3; i++ {
|
||||
if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err)
|
||||
if !isContinueWhenError {
|
||||
return nil, err
|
||||
}
|
||||
err = nil
|
||||
continue
|
||||
}
|
||||
qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800"
|
||||
for _, sku := range skuNameExt.Skus {
|
||||
jdCatID := 22410 // 其他国产水果
|
||||
if cat.Name == "进口水果" {
|
||||
jdCatID = 20342 // 其他进口水果
|
||||
}
|
||||
price := sku.LinkID
|
||||
sku.LinkID = 0
|
||||
skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
|
||||
fixedStatus := 1
|
||||
if sku.Status != model.SkuStatusNormal {
|
||||
fixedStatus = 2
|
||||
}
|
||||
var vendorSkuID string
|
||||
vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil)
|
||||
if err == nil {
|
||||
globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID)
|
||||
} else {
|
||||
globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err)
|
||||
if !isContinueWhenError {
|
||||
return nil, err
|
||||
}
|
||||
err = nil
|
||||
}
|
||||
// fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName)
|
||||
startOutSkuID++
|
||||
// rootTask.Cancel()
|
||||
// return nil, nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
return nil, err
|
||||
}, len(skuCatList))
|
||||
tasksch.ManageTask(rootTask).Run()
|
||||
if !isAsync {
|
||||
_, err = rootTask.GetResult(0)
|
||||
} else {
|
||||
hint = rootTask.ID
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) {
|
||||
// globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName)
|
||||
// return "123", err
|
||||
return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName)
|
||||
}
|
||||
|
||||
func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) {
|
||||
// globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
|
||||
// return "456", err
|
||||
return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package tempop
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/jpeg"
|
||||
@@ -15,6 +16,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||
"github.com/360EntSecGroup-Skylar/excelize"
|
||||
"github.com/qiniu/api.v7/storage"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||
@@ -29,6 +31,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
@@ -600,78 +603,6 @@ type GoodsOrderOriginalEx struct {
|
||||
OrderStatus int
|
||||
}
|
||||
|
||||
// func CreateOrderFromOriginal(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
// sqlBatchCount := 5000
|
||||
// rootTask := tasksch.NewSeqTask("CreateOrderFromOriginal", ctx,
|
||||
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
// sql := `
|
||||
// SELECT t1.*, t3.order_status
|
||||
// FROM goods_order_original t1
|
||||
// LEFT JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id
|
||||
// LEFT JOIN jxorder t3 ON t3.order_id = t1.vendor_order_id
|
||||
// WHERE t2.id IS NULL
|
||||
// LIMIT ?;
|
||||
// `
|
||||
// db := dao.GetDB()
|
||||
// var orderList []*GoodsOrderOriginalEx
|
||||
// if err = dao.GetRows(db, &orderList, sql, sqlBatchCount); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if len(orderList) > 0 {
|
||||
// task := tasksch.NewParallelTask("CreateOrderFromOriginal", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(1), ctx,
|
||||
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// orderOriginal := batchItemList[0].(*GoodsOrderOriginalEx)
|
||||
// globals.SugarLogger.Debugf("CreateOrderFromOriginal processing orderID:%s", orderOriginal.VendorOrderID)
|
||||
// if handler := partner.GetPurchasePlatformFromVendorID(orderOriginal.VendorID); handler != nil {
|
||||
// var detail map[string]interface{}
|
||||
// if err = utils.UnmarshalUseNumber([]byte(strings.Replace(strings.Replace(orderOriginal.OriginalData, "\n", "", -1), "\r", "", -1)), &detail); err != nil {
|
||||
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err)
|
||||
// return nil, err
|
||||
// }
|
||||
// order := handler.Map2Order(detail)
|
||||
// if order.Status < model.OrderStatusEndBegin {
|
||||
// if orderOriginal.OrderStatus == 3 {
|
||||
// order.Status = model.OrderStatusFinished
|
||||
// } else if orderOriginal.OrderStatus == 7 {
|
||||
// order.Status = model.OrderStatusCanceled
|
||||
// } else {
|
||||
// order2, err2 := handler.GetOrder(order.VendorOrderID)
|
||||
// if err = err2; err == nil {
|
||||
// order.Status = order2.Status
|
||||
// } else {
|
||||
// err = nil // ignore get status error
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if err == nil {
|
||||
// if _, err = orderman.FixedOrderManager.SaveOrder(order, false, dao.GetDB()); err != nil {
|
||||
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err)
|
||||
// }
|
||||
// } else {
|
||||
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err)
|
||||
// }
|
||||
// } else {
|
||||
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s", orderOriginal.VendorOrderID)
|
||||
// }
|
||||
// return nil, err
|
||||
// }, orderList)
|
||||
// // rootTask.AddChild(task).Run()
|
||||
// task.Run()
|
||||
// _, err = task.GetResult(0)
|
||||
// } else {
|
||||
// rootTask.Cancel()
|
||||
// }
|
||||
// return nil, err
|
||||
// }, math.MaxInt32)
|
||||
// tasksch.ManageTask(rootTask).Run()
|
||||
// if !isAsync {
|
||||
// _, err = rootTask.GetResult(0)
|
||||
// } else {
|
||||
// hint = rootTask.ID
|
||||
// }
|
||||
// return hint, err
|
||||
// }
|
||||
|
||||
func TransformJdSpu2Sku(ctx *jxcontext.Context, skuNameIDs []int, count int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
sql := `
|
||||
SELECT t1.*
|
||||
@@ -1359,3 +1290,213 @@ func JdStoreInfo1125() (hint string, err error) {
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
ebaiCatIDKey := "ebaiCatID"
|
||||
catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID)
|
||||
if err != nil {
|
||||
return hint, err
|
||||
}
|
||||
catMap := make(map[string]map[string]interface{})
|
||||
|
||||
allSkuInfo := make(map[string]map[string]map[string]map[string]interface{})
|
||||
for _, cat := range catList {
|
||||
catName := utils.Interface2String(cat["cat_name"])
|
||||
if catName == "限时特惠" || catName == "应季热销" {
|
||||
catName = "应季水果"
|
||||
}
|
||||
skuNameMap := allSkuInfo[catName]
|
||||
if skuNameMap == nil {
|
||||
skuNameMap = make(map[string]map[string]map[string]interface{})
|
||||
allSkuInfo[catName] = skuNameMap
|
||||
}
|
||||
if catMap[catName] == nil {
|
||||
catMap[catName] = cat
|
||||
}
|
||||
skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"])))
|
||||
if err = err2; err != nil {
|
||||
return hint, err
|
||||
}
|
||||
for _, sku := range skuList {
|
||||
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
|
||||
if specQuality > 0 {
|
||||
if catMap[catName][ebaiCatIDKey] == nil {
|
||||
catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"])
|
||||
}
|
||||
skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string)
|
||||
if skuNameMap[skuNameKey] == nil {
|
||||
skuNameMap[skuNameKey] = make(map[string]map[string]interface{})
|
||||
}
|
||||
skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku
|
||||
}
|
||||
}
|
||||
}
|
||||
allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt)
|
||||
catSeq := 0
|
||||
for catName, catSkuNameMap := range allSkuInfo {
|
||||
if len(catSkuNameMap) > 0 {
|
||||
skuCat := &model.SkuCategory{
|
||||
Name: catName,
|
||||
ParentID: 0,
|
||||
Level: 1,
|
||||
Type: model.SkuCategoryNormal,
|
||||
Seq: catSeq,
|
||||
EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])),
|
||||
}
|
||||
catSeq++
|
||||
for _, skuList := range catSkuNameMap {
|
||||
var skuNameExt *model.SkuNameExt
|
||||
for _, sku := range skuList {
|
||||
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
|
||||
if skuNameExt == nil {
|
||||
skuNameExt = &model.SkuNameExt{
|
||||
SkuName: model.SkuName{
|
||||
Prefix: prefix,
|
||||
Name: name,
|
||||
// CategoryID:
|
||||
IsGlobal: 1,
|
||||
Unit: unit,
|
||||
SpecQuality: specQuality,
|
||||
SpecUnit: specUnit,
|
||||
Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))),
|
||||
Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string),
|
||||
Status: model.SkuStatusNormal,
|
||||
IsSpu: 0,
|
||||
},
|
||||
}
|
||||
if len(skuList) > 1 {
|
||||
skuNameExt.Unit = "份"
|
||||
skuNameExt.SpecQuality = 500
|
||||
skuNameExt.SpecUnit = "g"
|
||||
}
|
||||
if skuNameExt.Unit == "份" {
|
||||
tmpSpecQuality := specQuality
|
||||
if specUnit == "kg" || specUnit == "l" {
|
||||
tmpSpecQuality *= 1000
|
||||
}
|
||||
skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality)
|
||||
}
|
||||
}
|
||||
mySku := &model.Sku{
|
||||
// CategoryID:
|
||||
// NameID:
|
||||
Comment: comment,
|
||||
SpecQuality: specQuality,
|
||||
SpecUnit: specUnit,
|
||||
Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))),
|
||||
Status: model.SkuStatusNormal,
|
||||
|
||||
LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用
|
||||
}
|
||||
if sku["enabled"].(string) == "0" {
|
||||
mySku.Status = model.SkuStatusDontSale
|
||||
}
|
||||
skuNameExt.Skus = append(skuNameExt.Skus, mySku)
|
||||
}
|
||||
allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startOutSkuID := 1000
|
||||
var skuCatList []*model.SkuCategory
|
||||
for cat := range allSkuInfo2 {
|
||||
skuCatList = append(skuCatList, cat)
|
||||
}
|
||||
putPolicy := storage.PutPolicy{
|
||||
Scope: globals.QiniuBucket,
|
||||
// Expires: 10 * 60,
|
||||
}
|
||||
cfg := &storage.Config{}
|
||||
upToken := putPolicy.UploadToken(api.QiniuAPI)
|
||||
rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx,
|
||||
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
var catID string
|
||||
cat := skuCatList[step]
|
||||
skuNameExtList := allSkuInfo2[cat]
|
||||
catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName())
|
||||
if err == nil {
|
||||
shopCategories := []int64{utils.Str2Int64(catID)}
|
||||
for _, skuNameExt := range skuNameExtList {
|
||||
var imgContent []byte
|
||||
skuNameExt.CategoryID = cat.ID
|
||||
skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1)
|
||||
if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil {
|
||||
globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err)
|
||||
if !isContinueWhenError {
|
||||
return nil, err
|
||||
}
|
||||
err = nil
|
||||
continue
|
||||
}
|
||||
formUploader := storage.NewFormUploader(cfg)
|
||||
ret := storage.PutRet{}
|
||||
key := jxutils.GenPicFileName(".jpeg")
|
||||
for i := 0; i < 3; i++ {
|
||||
if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err)
|
||||
if !isContinueWhenError {
|
||||
return nil, err
|
||||
}
|
||||
err = nil
|
||||
continue
|
||||
}
|
||||
qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800"
|
||||
for _, sku := range skuNameExt.Skus {
|
||||
jdCatID := 22410 // 其他国产水果
|
||||
if cat.Name == "进口水果" {
|
||||
jdCatID = 20342 // 其他进口水果
|
||||
}
|
||||
price := sku.LinkID
|
||||
sku.LinkID = 0
|
||||
skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
|
||||
fixedStatus := 1
|
||||
if sku.Status != model.SkuStatusNormal {
|
||||
fixedStatus = 2
|
||||
}
|
||||
var vendorSkuID string
|
||||
vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil)
|
||||
if err == nil {
|
||||
globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID)
|
||||
} else {
|
||||
globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err)
|
||||
if !isContinueWhenError {
|
||||
return nil, err
|
||||
}
|
||||
err = nil
|
||||
}
|
||||
// fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName)
|
||||
startOutSkuID++
|
||||
// rootTask.Cancel()
|
||||
// return nil, nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
return nil, err
|
||||
}, len(skuCatList))
|
||||
tasksch.ManageTask(rootTask).Run()
|
||||
if !isAsync {
|
||||
_, err = rootTask.GetResult(0)
|
||||
} else {
|
||||
hint = rootTask.ID
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) {
|
||||
// globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName)
|
||||
// return "123", err
|
||||
return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName)
|
||||
}
|
||||
|
||||
func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) {
|
||||
// globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
|
||||
// return "456", err
|
||||
return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user