From 9c2c65d266cd520710e95e79fd259e23221bb15e Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Dec 2019 09:41:11 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8E=BB=E6=8E=89SkuCategoryWithVendor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync2.go | 16 +++++++-------- business/model/dao/sku.go | 32 +++++++++++++++++------------ business/model/dao/store_sku.go | 7 +++++-- business/partner/partner.go | 6 +++--- business/partner/purchase/jd/sku.go | 8 ++++---- business/partner/purchase/jx/sku.go | 6 +++--- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index b28060a88..5d3b13ad8 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -44,16 +44,16 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs // todo 按vendorID orgCode合并操作 task := tasksch.NewParallelTask(fmt.Sprintf("同步分类:%v", catIDs), nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - catVendorInfo := batchItemList[0].(*dao.SkuCategoryWithVendor) + catVendorInfo := batchItemList[0].(*dao.SkuStoreCatInfo) if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(catVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { - if model.IsSyncStatusDelete(catVendorInfo.SyncStatus) { //删除 + if model.IsSyncStatusDelete(catVendorInfo.CatSyncStatus) { //删除 if !dao.IsVendorThingIDEmpty(catVendorInfo.VendorCatID) && - model.IsSyncStatusNeedDelete(catVendorInfo.SyncStatus) { + model.IsSyncStatusNeedDelete(catVendorInfo.CatSyncStatus) { err = multiStoresHandler.DeleteCategory2(ctx, catVendorInfo) } - } else if model.IsSyncStatusNew(catVendorInfo.SyncStatus) { // 新增 + } else if model.IsSyncStatusNew(catVendorInfo.CatSyncStatus) { // 新增 err = multiStoresHandler.CreateCategory2(ctx, catVendorInfo) - } else if model.IsSyncStatusUpdate(catVendorInfo.SyncStatus) { // 修改 + } else if model.IsSyncStatusUpdate(catVendorInfo.CatSyncStatus) { // 修改 err = multiStoresHandler.UpdateCategory2(ctx, catVendorInfo) } } else { @@ -94,7 +94,7 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool } } if len(vendorCatIDList) > 0 { - if err = multiStoresHandler.ReorderCategories2(ctx, vendorInfo.OrgCode, catList[0].VendorParentCatID, vendorCatIDList); err == nil { + if err = multiStoresHandler.ReorderCategories2(ctx, vendorInfo.OrgCode, catList[0].ParentVendorCatID, vendorCatIDList); err == nil { retVal = []int{len(vendorCatIDList)} } } @@ -163,14 +163,14 @@ func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy return nil } -func SkuCategoryVendor2ThingMap(cat *dao.SkuCategoryWithVendor) (thingMap *model.ThingMap) { +func SkuCategoryVendor2ThingMap(cat *dao.SkuStoreCatInfo) (thingMap *model.ThingMap) { thingMap = &model.ThingMap{ ThingID: int64(cat.ID), ThingType: model.ThingTypeCategory, VendorID: cat.VendorID, VendorOrgCode: cat.VendorOrgCode, - SyncStatus: cat.SyncStatus, + SyncStatus: cat.CatSyncStatus, VendorThingID: cat.VendorCatID, } thingMap.ID = cat.MapID // 一定要赋值 diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index c95200fe5..511a06f48 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -8,18 +8,18 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -type SkuCategoryWithVendor struct { - model.SkuCategory +// type SkuStoreCatInfo struct { +// model.SkuCategory - VendorID int `orm:"column(vendor_id)" json:"vendorID"` - VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 +// VendorID int `orm:"column(vendor_id)" json:"vendorID"` +// VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 - MapID int `orm:"column(map_id)" json:"mapID"` - VendorCatID string `orm:"size(32);column(vendor_cat_id)" json:"vendorCatID"` - SyncStatus int8 `orm:"default(2)"` +// MapID int `orm:"column(map_id)" json:"mapID"` +// VendorCatID string `orm:"size(32);column(vendor_cat_id)" json:"vendorCatID"` +// SyncStatus int8 `orm:"default(2)"` - VendorParentCatID string `orm:"size(32);column(vendor_parent_cat_id)" json:"vendorParentCatID"` -} +// VendorParentCatID string `orm:"size(32);column(vendor_parent_cat_id)" json:"vendorParentCatID"` +// } func GetSellCities(db *DaoDB, nameID int, vendorID int) (cities []*model.Place, err error) { cities = []*model.Place{} @@ -157,14 +157,20 @@ func SetSkuSyncStatus(db *DaoDB, vendorID int, skuIDs []int, syncStatus int) (nu return ExecuteSQL(db, sql, sqlParams...) } -func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuCategoryWithVendor, err error) { +func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuStoreCatInfo, err error) { sql := ` - SELECT t1.*, + SELECT t1m.vendor_id, t1m.vendor_org_code, + t1m.id map_id, - t1m.sync_status, + t1.*, t1m.vendor_thing_id vendor_cat_id, - t1pm.vendor_thing_id vendor_parent_cat_id + t1m.sync_status cat_sync_status, + + t1pm.id parent_map_id, + t1pm.t1p.name parent_cat_name + t1pm.vendor_thing_id parent_vendor_cat_id, + t1pm.sync_status parent_cat_sync_status /* t1.jd_sync_status sync_status, t1.jd_id vendor_cat_id, diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 5426955a4..202ded2e0 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -25,13 +25,16 @@ var ( ) type SkuStoreCatInfo struct { + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + + MapID int `orm:"column(map_id)"` // 这个主要用于判断是否有store_sku_category_map model.SkuCategory - MapID int `orm:"column(map_id)"` // 这个主要用于判断是否有store_sku_category_map VendorCatID string `orm:"column(vendor_cat_id)"` CatSyncStatus int8 + ParentMapID int `orm:"column(parent_map_id)"` // 这个主要用于判断是否有父store_sku_category_map ParentCatName string - ParentMapID int `orm:"column(parent_map_id)"` // 这个主要用于判断是否有父store_sku_category_map ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` ParentCatSyncStatus int8 } diff --git a/business/partner/partner.go b/business/partner/partner.go index b2fc5b81e..2786ee1d7 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -161,9 +161,9 @@ type IMultipleStoresHandler interface { DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) - CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) - UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) - DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) + CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) + UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) + DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) // sku diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 158b089fd..549d0d4af 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -149,9 +149,9 @@ func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, user return err } -func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) { +func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { if globals.EnableJdStoreWrite { - result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.VendorParentCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) + result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.ParentVendorCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) if err = err2; err == nil { if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { cat.VendorCatID = utils.Int64ToStr(jdID) @@ -163,14 +163,14 @@ func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuCa return err } -func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) { +func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { if globals.EnableJdStoreWrite { err = getAPI(cat.VendorOrgCode).UpdateShopCategory(utils.Str2Int64(cat.VendorCatID), cat.Name) } return err } -func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) { +func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { if globals.EnableJdStoreWrite { err = getAPI(cat.VendorOrgCode).DelShopCategory(utils.Str2Int64(cat.VendorCatID)) } diff --git a/business/partner/purchase/jx/sku.go b/business/partner/purchase/jx/sku.go index 30951dc7e..bc4144fbb 100644 --- a/business/partner/purchase/jx/sku.go +++ b/business/partner/purchase/jx/sku.go @@ -30,15 +30,15 @@ func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, user return err } -func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) { +func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { return err } -func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) { +func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { return err } -func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuCategoryWithVendor) (err error) { +func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { return err } From 92ecba727d8d3aa98378ee5485fc388d178d7e1e Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Dec 2019 14:55:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0SyncSkus=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E8=83=BD=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sku.go | 17 +- business/jxstore/cms/sync2.go | 95 +++++++++- business/model/dao/sku.go | 106 +++++++++-- business/model/dao/sku_test.go | 16 ++ business/model/dao/store_sku.go | 17 +- business/partner/partner.go | 6 +- business/partner/purchase/jd/sku.go | 159 +--------------- business/partner/purchase/jd/sku2.go | 224 +++++++++++++++++++++++ business/partner/purchase/jd/sku_test.go | 2 +- business/partner/purchase/jx/sku.go | 14 +- controllers/cms_sku.go | 3 +- 11 files changed, 465 insertions(+), 194 deletions(-) create mode 100644 business/model/dao/sku_test.go create mode 100644 business/partner/purchase/jd/sku2.go diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index a10d73cef..9c18dbcea 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -677,6 +677,10 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s dao.Rollback(db) return nil, err } + if err = OnCreateThing(ctx, db, int64(sku.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return nil, err + } } for _, placeCode := range skuNameExt.Places { placeBind := &model.SkuNamePlaceBind{} @@ -880,6 +884,10 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int if err = err2; err == nil { for _, v := range skuList { sku := &v.Sku + if err = OnDeleteThing(ctx, db, int64(v.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return 0, err + } if _, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldStatus: model.SkuStatusDeleted, @@ -887,11 +895,6 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int dao.Rollback(db) return 0, err } - - if err = OnDeleteThing(ctx, db, int64(v.ID), model.ThingTypeSku); err != nil { - dao.Rollback(db) - return 0, err - } } } @@ -1190,9 +1193,9 @@ func DeleteSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName return num, err } -func GetVendorSku(ctx *jxcontext.Context, vendorID int, vendorSkuID string) (skuNameInfo *model.SkuNameExt, err error) { +func GetVendorSku(ctx *jxcontext.Context, vendorID int, vendorOrgCode, vendorSkuID string) (skuNameInfo *model.SkuNameExt, err error) { if handler := CurVendorSync.GetMultiStoreHandler(vendorID); handler != nil { - return handler.ReadSku(vendorSkuID) + return handler.ReadSku(ctx, vendorOrgCode, vendorSkuID) } return nil, ErrCanNotFindVendor } diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 5d3b13ad8..f84310780 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -5,6 +5,8 @@ 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/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" @@ -40,7 +42,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs globals.SugarLogger.Debugf("SyncCategories catIDs:%v", catIDs) db := dao.GetDB() catList, err := dao.GetSkuCategoryWithVendor(db, nil, nil, -1, catIDs, true) - if err == nil { + if err == nil && len(catList) > 0 { // todo 按vendorID orgCode合并操作 task := tasksch.NewParallelTask(fmt.Sprintf("同步分类:%v", catIDs), nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { @@ -60,7 +62,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs err = fmt.Errorf("平台:%d不合法", catVendorInfo.VendorID) } if err = OnThingSync(ctx, dao.GetDB(), SkuCategoryVendor2ThingMap(catVendorInfo), err); err == nil { - retVal = []int{catVendorInfo.ID} + retVal = []int{1} } return retVal, err }, catList) @@ -77,6 +79,49 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs return hint, err } +func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, isAsync bool) (hint string, err error) { + globals.SugarLogger.Debugf("SyncSkus nameIDs:%v, skuIDs:%v", nameIDs, skuIDs) + db := dao.GetDB() + skuList, err := dao.GetSkusWithVendor(db, nil, nil, nameIDs, skuIDs, true) + if err == nil && len(skuList) > 0 { + // todo 按vendorID orgCode合并操作 + task := tasksch.NewParallelTask(fmt.Sprintf("同步商品:%v,%v", nameIDs, skuIDs), nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + skuVendorInfo := batchItemList[0].(*dao.StoreSkuSyncInfo) + skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus) + if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { + if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除 + if !dao.IsVendorThingIDEmpty(skuVendorInfo.VendorSkuID) && + model.IsSyncStatusNeedDelete(skuVendorInfo.SkuSyncStatus) { + err = multiStoresHandler.DeleteSku2(ctx, skuVendorInfo) + } + } else if model.IsSyncStatusNew(skuVendorInfo.SkuSyncStatus) { // 新增 + err = multiStoresHandler.CreateSku2(ctx, skuVendorInfo) + } else if model.IsSyncStatusUpdate(skuVendorInfo.SkuSyncStatus) { // 修改 + err = multiStoresHandler.UpdateSku2(ctx, skuVendorInfo) + } + } else { + err = fmt.Errorf("平台:%d不合法", skuVendorInfo.VendorID) + } + if err = OnThingSync(ctx, dao.GetDB(), SkuVendor2ThingMap(skuVendorInfo), err); err == nil { + retVal = []int{1} + } + return retVal, err + }, skuList) + tasksch.HandleTask(task, parentTask, len(skuList) > 0).Run() + if isAsync { + hint = task.GetID() + } else { + resultList, err2 := task.GetResult(0) + if err = err2; err == nil { + hint = utils.Int2Str(len(resultList)) + } + } + } + return hint, err +} + func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool) (hint string, err error) { globals.SugarLogger.Debugf("SyncReorderCategories parentCatID:%d", parentCatID) db := dao.GetDB() @@ -108,6 +153,10 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool } func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) { + if thingType == model.ThingTypeSkuName { + return nil + } + errList := errlist.New() for _, v := range getMultiStoreVendorInfoList() { thingMap := &model.ThingMap{ ThingID: thingID, @@ -117,12 +166,17 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy SyncStatus: model.SyncFlagNewMask, } dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName()) - err = dao.CreateEntity(db, thingMap) + errList.AddErr(dao.CreateEntity(db, thingMap)) } + // return errList.GetErrListAsOne() return nil } func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) { + if thingType == model.ThingTypeSkuName { + return nil + } + errList := errlist.New() for _, v := range getMultiStoreVendorInfoList() { thingMap := &model.ThingMap{ ThingID: thingID, @@ -131,16 +185,24 @@ func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy VendorOrgCode: v.OrgCode, } thingMap.DeletedAt = utils.DefaultTimeValue - if err = dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err == nil { + if err2 := dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err2 == nil { thingMap.SyncStatus |= model.SyncFlagModifiedMask thingMap.LastOperator = ctx.GetUserName() - _, err = dao.UpdateEntity(db, thingMap) + _, err2 = dao.UpdateEntity(db, thingMap) + errList.AddErr(err2) + } else if !dao.IsNoRowsError(err2) { + errList.AddErr(err2) } } + // return errList.GetErrListAsOne() return nil } func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) { + if thingType == model.ThingTypeSkuName { + return nil + } + errList := errlist.New() for _, v := range getMultiStoreVendorInfoList() { thingMap := &model.ThingMap{ ThingID: thingID, @@ -149,7 +211,7 @@ func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy VendorOrgCode: v.OrgCode, } thingMap.DeletedAt = utils.DefaultTimeValue - if err = dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err == nil { + if err2 := dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err2 == nil { if model.IsSyncStatusNew(thingMap.SyncStatus) { thingMap.SyncStatus = 0 thingMap.DeletedAt = time.Now() @@ -157,9 +219,13 @@ func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingTy thingMap.SyncStatus |= model.SyncFlagDeletedMask } thingMap.LastOperator = ctx.GetUserName() - _, err = dao.UpdateEntity(db, thingMap) + _, err2 = dao.UpdateEntity(db, thingMap) + errList.AddErr(err2) + } else if !dao.IsNoRowsError(err2) { + errList.AddErr(err2) } } + // return errList.GetErrListAsOne() return nil } @@ -177,7 +243,22 @@ func SkuCategoryVendor2ThingMap(cat *dao.SkuStoreCatInfo) (thingMap *model.Thing return thingMap } +func SkuVendor2ThingMap(sku *dao.StoreSkuSyncInfo) (thingMap *model.ThingMap) { + thingMap = &model.ThingMap{ + ThingID: int64(sku.SkuID), + ThingType: model.ThingTypeSku, + VendorID: sku.VendorID, + VendorOrgCode: sku.VendorOrgCode, + + SyncStatus: sku.SkuSyncStatus, + VendorThingID: sku.VendorSkuID, + } + thingMap.ID = sku.BindID // 一定要赋值 + return thingMap +} + func OnThingSync(ctx *jxcontext.Context, db *dao.DaoDB, thingMap *model.ThingMap, syncErr error) (err error) { + globals.SugarLogger.Debugf("OnThingSync thingMap:%s", utils.Format4Output(thingMap, true)) if syncErr != nil { err = syncErr thingMap.Remark = utils.LimitUTF8StringLen(err.Error(), 255) diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 511a06f48..2bc18b0c3 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -8,18 +8,10 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -// type SkuStoreCatInfo struct { -// model.SkuCategory - -// VendorID int `orm:"column(vendor_id)" json:"vendorID"` -// VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 - -// MapID int `orm:"column(map_id)" json:"mapID"` -// VendorCatID string `orm:"size(32);column(vendor_cat_id)" json:"vendorCatID"` -// SyncStatus int8 `orm:"default(2)"` - -// VendorParentCatID string `orm:"size(32);column(vendor_parent_cat_id)" json:"vendorParentCatID"` -// } +type tStoreSkuSyncInfo2 struct { + StoreSkuSyncInfo + VendorPlaceCode string +} func GetSellCities(db *DaoDB, nameID int, vendorID int) (cities []*model.Place, err error) { cities = []*model.Place{} @@ -157,6 +149,7 @@ func SetSkuSyncStatus(db *DaoDB, vendorID int, skuIDs []int, syncStatus int) (nu return ExecuteSQL(db, sql, sqlParams...) } +// 多门店平台使用,当前只有京东 func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuStoreCatInfo, err error) { sql := ` SELECT @@ -180,7 +173,7 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ? LEFT JOIN sku_category t1p ON t1p.id = t1.parent_id LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ? - AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code + AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code WHERE 1 = 1 ` sqlParams := []interface{}{ @@ -215,3 +208,90 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, err = GetRows(db, &catList, sql, sqlParams...) return catList, err } + +// 多门店平台使用,当前只有京东 +func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, mustDirty bool) (skuList []*StoreSkuSyncInfo, err error) { + sql := ` + SELECT + t1m.vendor_id, t1m.vendor_org_code, + + t1m.id bind_id, + t1.*, + t1.id sku_id, + t1m.vendor_thing_id vendor_sku_id, + t1m.sync_status sku_sync_status, + + t2.price, + t2.price unit_price, + t2.prefix, + t2.name, + t2.unit, + t2.upc, + t2.is_global, + t2.status name_status, + t2.img, + t2.img2, + t2.desc_img, + + t5.jd_code vendor_place_code, + + t3.jd_category_id vendor_vendor_cat_id, + + t3m.sync_status cat_sync_status, + t3m.vendor_thing_id vendor_cat_id + + FROM sku t1 + LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ? + JOIN sku_name t2 ON t2.id = t1.name_id + LEFT JOIN sku_category t3 ON t3.id = t2.category_id + LEFT JOIN thing_map t3m ON t3m.thing_id = t3.id AND t3m.thing_type = ? AND t3m.deleted_at = ? + AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code + LEFT JOIN sku_name_place_bind t4 ON t2.is_global = 0 AND t4.name_id = t1.name_id + LEFT JOIN place t5 ON t5.code = t4.place_code + WHERE 1 = 1 + ` + sqlParams := []interface{}{ + model.ThingTypeSku, + utils.DefaultTimeValue, + model.ThingTypeCategory, + utils.DefaultTimeValue, + } + if mustDirty { + sql += " AND t1m.sync_status <> 0" + } else { + sql += " AND t1.deleted_at = ?" + sqlParams = append(sqlParams, utils.DefaultTimeValue) + } + if len(vendorIDs) > 0 { + sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" + sqlParams = append(sqlParams, vendorIDs) + } + if len(appOrgCodes) > 0 { + sql += " AND t1m.vendor_org_code IN (" + GenQuestionMarks(len(appOrgCodes)) + ")" + sqlParams = append(sqlParams, appOrgCodes) + } + if len(nameIDs) > 0 { + sql += " AND t1.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + if len(skuIDs) > 0 { + sql += " AND t1.id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + sql += " ORDER BY t1.seq" + + var list []*tStoreSkuSyncInfo2 + if err = GetRows(db, &list, sql, sqlParams...); err == nil { + skuMap := make(map[int]*StoreSkuSyncInfo) + for _, v := range list { + if skuMap[v.SkuID] == nil { + skuMap[v.SkuID] = &v.StoreSkuSyncInfo + skuList = append(skuList, &v.StoreSkuSyncInfo) + } + if !IsVendorThingIDEmpty(v.VendorPlaceCode) { + skuMap[v.SkuID].SellCities = append(skuMap[v.SkuID].SellCities, v.VendorPlaceCode) + } + } + } + return skuList, err +} diff --git a/business/model/dao/sku_test.go b/business/model/dao/sku_test.go new file mode 100644 index 000000000..50e7e45e0 --- /dev/null +++ b/business/model/dao/sku_test.go @@ -0,0 +1,16 @@ +package dao + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals" +) + +func TestGetSkusWithVendor(t *testing.T) { + skuList, err := GetSkusWithVendor(GetDB(), nil, nil, []int{17368}, nil, true) + if err != nil { + t.Fatal(err) + } + globals.SugarLogger.Debug(utils.Format4Output(skuList, false)) +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 202ded2e0..532bf2b2e 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -40,6 +40,9 @@ type SkuStoreCatInfo struct { } type StoreSkuSyncInfo struct { + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + // 平台无关的store sku信息 BindID int `orm:"column(bind_id)"` // 换名的原因是与Sku.ID同名区别 StoreID int `orm:"column(store_id)"` @@ -57,12 +60,15 @@ type StoreSkuSyncInfo struct { model.Sku // sku_name - Prefix string - NameID int `orm:"column(name_id)"` - VendorNameID string `orm:"column(vendor_name_id)"` + Prefix string + // NameID int `orm:"column(name_id)"` + VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 Name string Unit string Upc string + IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 + NameStatus int + SellCities []string // 平台相关的图片信息 Img string @@ -71,11 +77,6 @@ type StoreSkuSyncInfo struct { VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) - // 饿百也只需要给出叶子结点了 - // https://open-be.ele.me/dev/notice?id=275 - // VendorVendorCatID2 int64 `orm:"column(vendor_vendor_cat_id2)"` // 平台商品分类上一级 - // VendorVendorCatID3 int64 `orm:"column(vendor_vendor_cat_id3)"` // 平台商品分类再上一级 - // sku的商家分类信息 SkuCatSyncStatus int8 SkuVendorCatID string `orm:"column(sku_vendor_cat_id)"` diff --git a/business/partner/partner.go b/business/partner/partner.go index 2786ee1d7..524c5b93c 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -168,10 +168,14 @@ type IMultipleStoresHandler interface { // sku CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) - ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) + ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) + CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) + UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) + DeleteSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) + // RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*SkuNameInfo, err error) diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 549d0d4af..3f39b0ed9 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -15,14 +15,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" - "github.com/astaxie/beego" -) - -const ( - DefBrandID = 35247 - - DefJdCategoryID = 20362 - DefJdCategoryID4Jxgy = 22410 // 其他国产水果 ) type tSkuInfoExt struct { @@ -39,13 +31,6 @@ var ( } ) -func getDefJdCategoryID() int { - if beego.BConfig.RunMode == "jxgy" { - return DefJdCategoryID4Jxgy - } - return DefJdCategoryID -} - func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { var jdPid int64 if cat.ParentID != 0 { @@ -68,46 +53,6 @@ func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, return err } -func jdCat2Jx(jdCat *jdapi.CategoryInfo) (jxCat *partner.BareCategoryInfo) { - return &partner.BareCategoryInfo{ - VendorCatID: utils.Int64ToStr(jdCat.Id), - Level: jdCat.Level, - Name: jdCat.Name, - Seq: jdCat.Sort, - } -} - -func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) { - result, err := getAPI(vendorOrgCode).QueryCategoriesByOrgCode() - if err == nil { - catMap := make(map[int64]*partner.BareCategoryInfo) - level := 1 - for { - processedCount := 0 - for _, jdCat := range result { - if jdCat.Level == level { - processedCount++ - jxCat := jdCat2Jx(jdCat) - if level == 1 { - cats = append(cats, jxCat) - } else { - parentCat := catMap[jdCat.ParentId] - if parentCat != nil { - parentCat.Children = append(parentCat.Children, jxCat) - } - } - catMap[jdCat.Id] = jxCat - } - } - if processedCount == 0 { - break - } - level++ - } - } - return cats, err -} - func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { if globals.EnableJdStoreWrite { return getAPI("").UpdateShopCategory(cat.JdID, cat.Name) @@ -149,41 +94,6 @@ func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, user return err } -func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { - if globals.EnableJdStoreWrite { - result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.ParentVendorCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) - if err = err2; err == nil { - if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { - cat.VendorCatID = utils.Int64ToStr(jdID) - } - } - } else { - cat.VendorCatID = utils.Int64ToStr(jxutils.GenFakeID()) - } - return err -} - -func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { - if globals.EnableJdStoreWrite { - err = getAPI(cat.VendorOrgCode).UpdateShopCategory(utils.Str2Int64(cat.VendorCatID), cat.Name) - } - return err -} - -func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { - if globals.EnableJdStoreWrite { - err = getAPI(cat.VendorOrgCode).DelShopCategory(utils.Str2Int64(cat.VendorCatID)) - } - return err -} - -func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) { - if globals.EnableJdStoreWrite { - err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64(vendorParentCatID), utils.StringSlice2Int64(vendorCatIDList)) - } - return err -} - func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) { var skuInfoExt tSkuInfoExt err = dao.GetRow(nil, &skuInfoExt, ` @@ -266,15 +176,16 @@ func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName stri }) } -func (p *PurchaseHandler) ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { +func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { jdSkuID := utils.Str2Int64(vendorSkuID) - skuList, _, err := getAPI("").QuerySkuInfos(&jdapi.QuerySkuParam{ + a := getAPI(vendorOrgCode) + skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{ SkuID: jdSkuID, }) if err == nil { if len(skuList) >= 1 { skuNameExt = &model.SkuNameExt{} - if imgList, err2 := getAPI("").QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{ + if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{ SkuIDs: []int64{jdSkuID}, }); err2 == nil && len(imgList) > 0 { skuNameExt.Img = imgList[0].SourceImgURL @@ -577,68 +488,6 @@ func composeSkuSpec(specQuality float32, specUnit, unit string) string { return value } -func jdStatus2jxStatus(jdStatus int) (jxStatus int) { - switch jdStatus { - case jdapi.SkuFixedStatusOnline: - jxStatus = model.SkuStatusNormal - case jdapi.SkuFixedStatusOffline: - jxStatus = model.SkuStatusDontSale - case jdapi.SkuFixedStatusDeleted: - jxStatus = model.SkuStatusDeleted - } - return jxStatus -} - -func jxStatus2jdStatus(jxStatus int) (jdStatus int) { - switch jxStatus { - case model.SkuStatusNormal: - jdStatus = jdapi.SkuFixedStatusOnline - case model.SkuStatusDontSale: - jdStatus = jdapi.SkuFixedStatusOffline - case model.SkuStatusDeleted: - jdStatus = jdapi.SkuFixedStatusDeleted - } - return jdStatus -} - -func (p *PurchaseHandler) getVendorCategories(level int, pid int64) (vendorCats []*model.SkuVendorCategory, err error) { - cats, err := getAPI("").QueryChildCategoriesForOP(pid) - if err != nil { - return nil, err - } - for _, v := range cats { - if v.Status == 1 { - cat := &model.SkuVendorCategory{ - VendorID: model.VendorIDJD, - Name: v.Name, - Level: level, - VendorCategoryID: utils.Int64ToStr(v.Id), - } - if level > 1 { - cat.ParentID = utils.Int64ToStr(v.ParentId) - if level == 3 { - cat.IsLeaf = 1 - } - } - vendorCats = append(vendorCats, cat) - if level < 3 { - childVendorCats, err2 := p.getVendorCategories(level+1, v.Id) - if err2 == nil && len(childVendorCats) > 0 { - vendorCats = append(vendorCats, childVendorCats...) - } else { - cat.IsLeaf = 1 - } - } - } - } - return vendorCats, nil -} - -func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) { - vendorCats, err = p.getVendorCategories(1, 0) - return vendorCats, err -} - func (p *PurchaseHandler) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*partner.SkuNameInfo, err error) { param := &jdapi.QuerySkuParam{ SkuID: utils.Str2Int64WithDefault(vendorSkuID, 0), diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go new file mode 100644 index 000000000..9e85466eb --- /dev/null +++ b/business/partner/purchase/jd/sku2.go @@ -0,0 +1,224 @@ +package jd + +import ( + "fmt" + + "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/jxcontext" + "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/globals" + "github.com/astaxie/beego" +) + +const ( + DefBrandID = 35247 + + DefJdCategoryID = 20362 + DefJdCategoryID4Jxgy = 22410 // 其他国产水果 +) + +func getDefJdCategoryID() int { + if beego.BConfig.RunMode == "jxgy" { + return DefJdCategoryID4Jxgy + } + return DefJdCategoryID +} + +func jdCat2Jx(jdCat *jdapi.CategoryInfo) (jxCat *partner.BareCategoryInfo) { + return &partner.BareCategoryInfo{ + VendorCatID: utils.Int64ToStr(jdCat.Id), + Level: jdCat.Level, + Name: jdCat.Name, + Seq: jdCat.Sort, + } +} + +func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) { + result, err := getAPI(vendorOrgCode).QueryCategoriesByOrgCode() + if err == nil { + catMap := make(map[int64]*partner.BareCategoryInfo) + level := 1 + for { + processedCount := 0 + for _, jdCat := range result { + if jdCat.Level == level { + processedCount++ + jxCat := jdCat2Jx(jdCat) + if level == 1 { + cats = append(cats, jxCat) + } else { + parentCat := catMap[jdCat.ParentId] + if parentCat != nil { + parentCat.Children = append(parentCat.Children, jxCat) + } + } + catMap[jdCat.Id] = jxCat + } + } + if processedCount == 0 { + break + } + level++ + } + } + return cats, err +} + +func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdStoreWrite { + result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.ParentVendorCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) + if err = err2; err == nil { + if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { + cat.VendorCatID = utils.Int64ToStr(jdID) + } + } + } else { + cat.VendorCatID = utils.Int64ToStr(jxutils.GenFakeID()) + } + return err +} + +func (p *PurchaseHandler) UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI(cat.VendorOrgCode).UpdateShopCategory(utils.Str2Int64(cat.VendorCatID), cat.Name) + } + return err +} + +func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI(cat.VendorOrgCode).DelShopCategory(utils.Str2Int64(cat.VendorCatID)) + } + return err +} + +func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) { + if globals.EnableJdStoreWrite { + err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64(vendorParentCatID), utils.StringSlice2Int64(vendorCatIDList)) + } + return err +} + +func (p *PurchaseHandler) getVendorCategories(level int, pid int64) (vendorCats []*model.SkuVendorCategory, err error) { + cats, err := getAPI("").QueryChildCategoriesForOP(pid) + if err != nil { + return nil, err + } + for _, v := range cats { + if v.Status == 1 { + cat := &model.SkuVendorCategory{ + VendorID: model.VendorIDJD, + Name: v.Name, + Level: level, + VendorCategoryID: utils.Int64ToStr(v.Id), + } + if level > 1 { + cat.ParentID = utils.Int64ToStr(v.ParentId) + if level == 3 { + cat.IsLeaf = 1 + } + } + vendorCats = append(vendorCats, cat) + if level < 3 { + childVendorCats, err2 := p.getVendorCategories(level+1, v.Id) + if err2 == nil && len(childVendorCats) > 0 { + vendorCats = append(vendorCats, childVendorCats...) + } else { + cat.IsLeaf = 1 + } + } + } + } + return vendorCats, nil +} + +func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) { + vendorCats, err = p.getVendorCategories(1, 0) + return vendorCats, err +} + +func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jdapi.OpSkuParam) { + param = &jdapi.OpSkuParam{ + TraceID: ctx.GetTrackInfo(), + OutSkuID: utils.Int2Str(sku.SkuID), + ShopCategories: []int64{utils.Str2Int64(sku.VendorCatID)}, + CategoryID: sku.VendorVendorCatID, + BrandID: DefBrandID, + SkuName: utils.LimitUTF8StringLen(sku.SkuName, jdapi.MaxSkuNameCharCount), + SkuPrice: int(sku.Price), + Weight: float64(jxutils.IntWeight2Float(sku.Weight)), + FixedStatus: jxStatus2jdStatus(sku.MergedStatus), + IsSale: jdapi.IsSaleNo, // todo ? + + Upc: sku.Upc, + Images: jxutils.BatchString2Slice(sku.Img, sku.Img2), + } + if param.CategoryID == 0 { + param.CategoryID = int64(getDefJdCategoryID()) + } + if sku.IsGlobal == 0 && len(sku.SellCities) > 0 { + param.SellCities = utils.StringSlice2Int64(sku.SellCities) + } + if sku.DescImg != "" { + param.ProductDesc = fmt.Sprintf(`一张图片`, sku.DescImg) + } + return param +} + +func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + param := skuInfo2Param(ctx, sku) + if globals.EnableJdStoreWrite { + sku.VendorSkuID, err = getAPI(sku.VendorOrgCode).AddSku2(param) + } else { + sku.VendorSkuID = utils.Int64ToStr(jxutils.GenFakeID()) + } + return err +} + +func (p *PurchaseHandler) UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + param := skuInfo2Param(ctx, sku) + if globals.EnableJdStoreWrite { + _, err = getAPI(sku.VendorOrgCode).UpdateSku2(param) + } + return err +} + +func (p *PurchaseHandler) DeleteSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + param := &jdapi.OpSkuParam{ + TraceID: ctx.GetTrackInfo(), + OutSkuID: utils.Int2Str(sku.SkuID), + FixedStatus: jdapi.SkuFixedStatusDeleted, + } + if globals.EnableJdStoreWrite { + _, err = getAPI(sku.VendorOrgCode).UpdateSku2(param) + } + return err +} + +func jdStatus2jxStatus(jdStatus int) (jxStatus int) { + switch jdStatus { + case jdapi.SkuFixedStatusOnline: + jxStatus = model.SkuStatusNormal + case jdapi.SkuFixedStatusOffline: + jxStatus = model.SkuStatusDontSale + case jdapi.SkuFixedStatusDeleted: + jxStatus = model.SkuStatusDeleted + } + return jxStatus +} + +func jxStatus2jdStatus(jxStatus int) (jdStatus int) { + switch jxStatus { + case model.SkuStatusNormal: + jdStatus = jdapi.SkuFixedStatusOnline + case model.SkuStatusDontSale: + jdStatus = jdapi.SkuFixedStatusOffline + case model.SkuStatusDeleted: + jdStatus = jdapi.SkuFixedStatusDeleted + } + return jdStatus +} diff --git a/business/partner/purchase/jd/sku_test.go b/business/partner/purchase/jd/sku_test.go index bbb28661b..d05e7f67d 100644 --- a/business/partner/purchase/jd/sku_test.go +++ b/business/partner/purchase/jd/sku_test.go @@ -46,7 +46,7 @@ func TestGetAllCategories(t *testing.T) { } func TestReadSku(t *testing.T) { - skuName, err := CurPurchaseHandler.ReadSku("2005582952") + skuName, err := CurPurchaseHandler.ReadSku(jxcontext.AdminCtx, "", "2005582952") t.Log(utils.Format4Output(skuName, false)) if err != nil { t.Fatal(err.Error()) diff --git a/business/partner/purchase/jx/sku.go b/business/partner/purchase/jx/sku.go index bc4144fbb..cb8fcbdad 100644 --- a/business/partner/purchase/jx/sku.go +++ b/business/partner/purchase/jx/sku.go @@ -50,7 +50,7 @@ func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName stri return err } -func (p *PurchaseHandler) ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { +func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { return skuNameExt, err } @@ -62,6 +62,18 @@ func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName stri return err } +func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + return err +} + +func (p *PurchaseHandler) UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + return err +} + +func (p *PurchaseHandler) DeleteSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + return err +} + func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { return hint, err } diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index 164d6df80..03d1d09c4 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -296,12 +296,13 @@ func (c *SkuController) DeleteSkuNamePlace() { // @Param token header string true "认证token" // @Param vendorSkuID query string true "sku ID" // @Param vendorID query int true "门店所属的厂商ID" +// @Param vendorOrgCode query string true "厂商内组织代码" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetVendorSku [get] func (c *SkuController) GetVendorSku() { c.callGetVendorSku(func(params *tSkuGetVendorSkuParams) (retVal interface{}, errCode string, err error) { - retVal, err = cms.GetVendorSku(params.Ctx, params.VendorID, params.VendorSkuID) + retVal, err = cms.GetVendorSku(params.Ctx, params.VendorID, params.VendorOrgCode, params.VendorSkuID) return retVal, "", err }) } From 7fb09f99d1d5b476c382cc1756349412f64e4ad0 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Dec 2019 15:20:22 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=95=B4=E7=90=86DataResource=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sku.go | 75 ++++------- business/jxstore/initdata/initdata.go | 166 ++++++++++++------------ business/jxstore/tempop/tempop.go | 176 +++++++++++++------------- business/jxutils/datares/datares.go | 6 +- business/model/dao/store_sku.go | 6 - business/model/sku.go | 12 +- 6 files changed, 201 insertions(+), 240 deletions(-) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 9c18dbcea..e1b09f4dd 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -615,39 +615,18 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s skuNameExt.SpecUnit = skuNameExt.Skus[0].SpecUnit } - if globals.EnableStoreWrite { - // imgContent, imgMD5, err := jxutils.DownloadFileByURL(skuNameExt.Img) - // if err != nil { - // return nil, err - // } - // if skuNameExt.ImgHashCode == "" { - // skuNameExt.ImgHashCode = imgMD5 - // } else if skuNameExt.ImgHashCode != imgMD5 { - // return nil, errors.New("图片HASH值不同") - // } - // imgHintMap, err := UploadImg2Platforms(ctx, nil, skuNameExt.Img, imgContent, "") - // if err != nil { - // return nil, err - // } - // skuNameExt.ImgEbai = imgHintMap[model.VendorIDEBAI] - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name, skuNameExt.Img, model.ImgTypeMain, false) - if err = err2; err != nil { - return nil, err - } - // skuNameExt.ImgHashCode = dataRes.HashCode - skuNameExt.ImgEbai = dataRes.EbaiURL - if skuNameExt.Img2 != "" { - datares.TryRegisterDataResource(ctx, skuNameExt.Name, skuNameExt.Img2, model.ImgTypeMain, true) - } - - if skuNameExt.DescImg != "" { - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name+"desc", skuNameExt.DescImg, model.ImgTypeDesc, false) + for _, imgName := range []string{skuNameExt.Img, skuNameExt.Img2} { + if imgName != "" { + _, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name, imgName, model.ImgTypeMain, false) if err = err2; err != nil { return nil, err } - skuNameExt.DescImgEbai = dataRes.EbaiURL } - if err != nil { + } + + if skuNameExt.DescImg != "" { + _, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name+"desc", skuNameExt.DescImg, model.ImgTypeDesc, false) + if err = err2; err != nil { return nil, err } } @@ -724,10 +703,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } delete(payload, "isSpu") - delete(payload, "imgHashCode") - delete(payload, "imgWeimob") - delete(payload, "imgEbai") - delete(payload, "descImgEbai") delete(payload, "seq") valid := dao.StrictMakeMapByStructObject(payload, skuName, userName) @@ -747,31 +722,27 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } err = nil } - if globals.EnableStoreWrite { - if valid["img"] != nil { - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid["img"].(string), model.ImgTypeMain, false) - if err = err2; err != nil { - return 0, err - } - valid["ImgEbai"] = dataRes.EbaiURL - } - if valid["img2"] != nil { - datares.TryRegisterDataResource(ctx, skuName.Name, valid["img2"].(string), model.ImgTypeMain, true) - } - - if valid["descImg"] != nil { - descImg := valid["descImg"].(string) - if descImg != "" { - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name+"_desc", descImg, model.ImgTypeDesc, false) + for _, imgName := range []string{"img", "img2"} { + if valid[imgName] != nil { + if imgStr := utils.Interface2String(valid[imgName]); imgStr != "" { + _, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid[imgName].(string), model.ImgTypeMain, true) if err = err2; err != nil { return 0, err } - valid["descImgEbai"] = dataRes.EbaiURL - } else { - valid["descImgEbai"] = "" } } } + + if valid["descImg"] != nil { + descImg := valid["descImg"].(string) + if descImg != "" { + _, err2 := datares.TryRegisterDataResource(ctx, skuName.Name+"_desc", descImg, model.ImgTypeDesc, false) + if err = err2; err != nil { + return 0, err + } + } + } + dao.Begin(db) defer func() { if r := recover(); r != nil { diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index 70d0b2ba9..5a30b28f7 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -5,8 +5,6 @@ import ( "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/utils" - "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" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" @@ -190,88 +188,88 @@ func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hin } func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { - db := dao.GetDB() - rootTask := tasksch.NewSeqTask("合并SkuName图片至DataResource", ctx, - func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - switch step { - case 0: // 计算SkuName中缺失的hashCode(注意是DescImg不是Img) - var skuNameList []*model.SkuName - if err = dao.GetRows(db, &skuNameList, ` - SELECT t1.* - FROM sku_name t1 - WHERE t1.desc_img <> '' AND t1.img_hash_code = '' - `); err == nil && len(skuNameList) > 0 { - calcTask := tasksch.NewParallelTask("UploadImg4Vendors calc hashCode", - tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - skuName := batchItemList[0].(*model.SkuName) - _, skuName.ImgHashCode, err = jxutils.DownloadFileByURL(skuName.DescImg) - if err == nil { - dao.UpdateEntity(db, skuName, "ImgHashCode") - } - return retVal, err - }, skuNameList) - tasksch.HandleTask(calcTask, task, false).Run() - _, err = calcTask.GetResult(0) - } - case 1: // 从SkuName添加缺失的图片至DataResource - _, err = dao.ExecuteSQL(db, ` - INSERT INTO data_resource(created_at, updated_at, last_operator, hash_code, - resource_type, name, main_url, ebai_url, qiniu_url, use_type) - SELECT t1.created_at, t1.created_at, t1.last_operator, t1.img_hash_code, - CASE - WHEN INSTR(t1.desc_img, ".jpg") > 0 OR INSTR(t1.desc_img, ".jpeg") > 0 THEN - 'image/jpeg' - WHEN INSTR(t1.desc_img, ".png") > 0 OR INSTR(t1.desc_img, ".peg") > 0 THEN - 'image/png' - WHEN INSTR(t1.desc_img, ".gif") THEN - 'image/gif' - ELSE - '' - END resource_type, - CONCAT(t1.name, '_desc'), desc_img main_url, t1.desc_img_ebai ebai_url, - IF(INSTR(t1.desc_img, "image.jxc4.com") > 0, t1.desc_img, '') qiniu_url, 2 - FROM sku_name t1 - JOIN ( - SELECT img_hash_code, MAX(id) id, COUNT(*) ct - FROM sku_name - WHERE img_hash_code <> '' AND desc_img <> '' - GROUP BY 1 - ) t3 ON t3.id = t1.id - LEFT JOIN data_resource t2 ON (t2.main_url <> '' AND t2.main_url = t1.desc_img) - WHERE t1.desc_img <> '' AND t1.img_hash_code <> '' AND t2.id IS NULL; - `) - case 2: // 统一SkuName中同hashCode,不同图片地址至同一地址 - _, err = dao.ExecuteSQL(db, ` - UPDATE sku_name t1 - JOIN data_resource t2 ON t2.hash_code = t1.img_hash_code AND t2.main_url <> '' - SET t1.desc_img = t2.main_url - WHERE t1.img_hash_code <> '' AND t1.desc_img <> t2.main_url; - `) - case 3: // 上传DataResource中缺失的平台图片 - dataResList, err2 := dao.GetNeedUploadDataResource(db) - if err = err2; err == nil && len(dataResList) > 0 { - uploadTask := tasksch.NewParallelTask("批量上传图片至平台", - tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(2), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - dataRes := batchItemList[0].(*model.DataResource) - _, err = datares.UploadImage2Vendors(ctx, task, dataRes, nil, false) - return nil, err - }, dataResList) - tasksch.HandleTask(uploadTask, task, true).Run() - _, err = uploadTask.GetResult(0) - } - } - return result, err - }, 4) - tasksch.HandleTask(rootTask, nil, true).Run() - if !isAsync { - if _, err = rootTask.GetResult(0); err == nil { - hint = "1" - } - } else { - hint = rootTask.ID - } + // db := dao.GetDB() + // rootTask := tasksch.NewSeqTask("合并SkuName图片至DataResource", ctx, + // func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + // switch step { + // case 0: // 计算SkuName中缺失的hashCode(注意是DescImg不是Img) + // var skuNameList []*model.SkuName + // if err = dao.GetRows(db, &skuNameList, ` + // SELECT t1.* + // FROM sku_name t1 + // WHERE t1.desc_img <> '' AND t1.img_hash_code = '' + // `); err == nil && len(skuNameList) > 0 { + // calcTask := tasksch.NewParallelTask("UploadImg4Vendors calc hashCode", + // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // skuName := batchItemList[0].(*model.SkuName) + // _, skuName.ImgHashCode, err = jxutils.DownloadFileByURL(skuName.DescImg) + // if err == nil { + // dao.UpdateEntity(db, skuName, "ImgHashCode") + // } + // return retVal, err + // }, skuNameList) + // tasksch.HandleTask(calcTask, task, false).Run() + // _, err = calcTask.GetResult(0) + // } + // case 1: // 从SkuName添加缺失的图片至DataResource + // _, err = dao.ExecuteSQL(db, ` + // INSERT INTO data_resource(created_at, updated_at, last_operator, hash_code, + // resource_type, name, main_url, ebai_url, qiniu_url, use_type) + // SELECT t1.created_at, t1.created_at, t1.last_operator, t1.img_hash_code, + // CASE + // WHEN INSTR(t1.desc_img, ".jpg") > 0 OR INSTR(t1.desc_img, ".jpeg") > 0 THEN + // 'image/jpeg' + // WHEN INSTR(t1.desc_img, ".png") > 0 OR INSTR(t1.desc_img, ".peg") > 0 THEN + // 'image/png' + // WHEN INSTR(t1.desc_img, ".gif") THEN + // 'image/gif' + // ELSE + // '' + // END resource_type, + // CONCAT(t1.name, '_desc'), desc_img main_url, t1.desc_img_ebai ebai_url, + // IF(INSTR(t1.desc_img, "image.jxc4.com") > 0, t1.desc_img, '') qiniu_url, 2 + // FROM sku_name t1 + // JOIN ( + // SELECT img_hash_code, MAX(id) id, COUNT(*) ct + // FROM sku_name + // WHERE img_hash_code <> '' AND desc_img <> '' + // GROUP BY 1 + // ) t3 ON t3.id = t1.id + // LEFT JOIN data_resource t2 ON (t2.main_url <> '' AND t2.main_url = t1.desc_img) + // WHERE t1.desc_img <> '' AND t1.img_hash_code <> '' AND t2.id IS NULL; + // `) + // case 2: // 统一SkuName中同hashCode,不同图片地址至同一地址 + // _, err = dao.ExecuteSQL(db, ` + // UPDATE sku_name t1 + // JOIN data_resource t2 ON t2.hash_code = t1.img_hash_code AND t2.main_url <> '' + // SET t1.desc_img = t2.main_url + // WHERE t1.img_hash_code <> '' AND t1.desc_img <> t2.main_url; + // `) + // case 3: // 上传DataResource中缺失的平台图片 + // dataResList, err2 := dao.GetNeedUploadDataResource(db) + // if err = err2; err == nil && len(dataResList) > 0 { + // uploadTask := tasksch.NewParallelTask("批量上传图片至平台", + // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(2), ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // dataRes := batchItemList[0].(*model.DataResource) + // _, err = datares.UploadImage2Vendors(ctx, task, dataRes, nil, false) + // return nil, err + // }, dataResList) + // tasksch.HandleTask(uploadTask, task, true).Run() + // _, err = uploadTask.GetResult(0) + // } + // } + // return result, err + // }, 4) + // tasksch.HandleTask(rootTask, nil, true).Run() + // if !isAsync { + // if _, err = rootTask.GetResult(0); err == nil { + // hint = "1" + // } + // } else { + // hint = rootTask.ID + // } return hint, err } diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index d13670c09..de9df59ec 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -4,10 +4,6 @@ import ( "bytes" "context" "fmt" - "image" - "image/jpeg" - "image/png" - "net/http" "regexp" "strings" "sync" @@ -1046,92 +1042,92 @@ func CreateConsumerFromOrders(ctx *jxcontext.Context, vendorIDs []int, fromDate, } func CheckImages(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { - db := dao.GetDB() - rootTask := tasksch.NewSeqTask("检查图片的有效性", ctx, - func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - switch step { - case 0: // 检查图片的格式与大小 - var imgList []*model.DataResource - if err = dao.GetRows(db, &imgList, ` - SELECT t1.* - FROM data_resource t1 - WHERE t1.use_type = 1 - `); err == nil && len(imgList) > 0 { - calcTask := tasksch.NewParallelTask("检查京西图片的有效性", - tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - dataRes := batchItemList[0].(*model.DataResource) - binaryData, hashCode, err2 := jxutils.DownloadFileByURL(dataRes.MainURL) - if err = err2; err == nil { - errMsg := "" - if hashCode != dataRes.HashCode { - errMsg = fmt.Sprintf("hashcode:%s", hashCode) - dataRes.HashCode = hashCode - } - resType := http.DetectContentType(binaryData) - if resType != dataRes.ResourceType { - errMsg += "," + resType - dataRes.ResourceType = resType - } - var img image.Image - if dataRes.ResourceType == "image/png" { - img, err = png.Decode(bytes.NewReader(binaryData)) - } else if dataRes.ResourceType == "image/jpeg" { - img, err = jpeg.Decode(bytes.NewReader(binaryData)) - } - if err == nil { - if img != nil { - if img.Bounds().Dx() != 800 || img.Bounds().Dy() != 800 { - errMsg += fmt.Sprintf(",size:%dx%d", img.Bounds().Dx(), img.Bounds().Dy()) - } - } - } else { - errMsg += "," + err.Error() - } - if errMsg != "" { - dataRes.Remark = errMsg - dao.UpdateEntity(dao.GetDB(), dataRes, "Remark", "ResourceType", "HashCode") - } - } - return retVal, err - }, imgList) - tasksch.HandleTask(calcTask, task, false).Run() - _, err = calcTask.GetResult(0) - } - case 1: // 检查京东商品图片 - skuNameInfo, err2 := cms.GetSkuNames(ctx, "", false, map[string]interface{}{}, 0, -1) - if err = err2; err == nil && len(skuNameInfo.SkuNames) > 0 { - calcTask := tasksch.NewParallelTask("检查京东图片的有效性", - tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - skuName := batchItemList[0].(*model.SkuNameExt) - for _, sku := range skuName.Skus { - if sku.JdID != 0 { - skuPageInfo, err2 := api.JdAPI.GetSkuPageInfo(sku.JdID) - if err = err2; err == nil && skuPageInfo.FixedStatus && len(skuPageInfo.Image) == 0 { - err = fmt.Errorf("skuName:%d, sku:%d, jdid:%d, 没有图片", skuName.ID, sku.ID, sku.JdID) - skuName.ImgHashCode = "np" - dao.UpdateEntity(dao.GetDB(), &skuName.SkuName, "ImgHashCode") - } - break - } - } - return retVal, err - }, skuNameInfo.SkuNames) - tasksch.HandleTask(calcTask, task, false).Run() - _, err = calcTask.GetResult(0) - } - } - return result, err - }, 2) - tasksch.HandleTask(rootTask, nil, true).Run() - if !isAsync { - if _, err = rootTask.GetResult(0); err == nil { - hint = "1" - } - } else { - hint = rootTask.ID - } + // db := dao.GetDB() + // rootTask := tasksch.NewSeqTask("检查图片的有效性", ctx, + // func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + // switch step { + // case 0: // 检查图片的格式与大小 + // var imgList []*model.DataResource + // if err = dao.GetRows(db, &imgList, ` + // SELECT t1.* + // FROM data_resource t1 + // WHERE t1.use_type = 1 + // `); err == nil && len(imgList) > 0 { + // calcTask := tasksch.NewParallelTask("检查京西图片的有效性", + // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // dataRes := batchItemList[0].(*model.DataResource) + // binaryData, hashCode, err2 := jxutils.DownloadFileByURL(dataRes.MainURL) + // if err = err2; err == nil { + // errMsg := "" + // if hashCode != dataRes.HashCode { + // errMsg = fmt.Sprintf("hashcode:%s", hashCode) + // dataRes.HashCode = hashCode + // } + // resType := http.DetectContentType(binaryData) + // if resType != dataRes.ResourceType { + // errMsg += "," + resType + // dataRes.ResourceType = resType + // } + // var img image.Image + // if dataRes.ResourceType == "image/png" { + // img, err = png.Decode(bytes.NewReader(binaryData)) + // } else if dataRes.ResourceType == "image/jpeg" { + // img, err = jpeg.Decode(bytes.NewReader(binaryData)) + // } + // if err == nil { + // if img != nil { + // if img.Bounds().Dx() != 800 || img.Bounds().Dy() != 800 { + // errMsg += fmt.Sprintf(",size:%dx%d", img.Bounds().Dx(), img.Bounds().Dy()) + // } + // } + // } else { + // errMsg += "," + err.Error() + // } + // if errMsg != "" { + // dataRes.Remark = errMsg + // dao.UpdateEntity(dao.GetDB(), dataRes, "Remark", "ResourceType", "HashCode") + // } + // } + // return retVal, err + // }, imgList) + // tasksch.HandleTask(calcTask, task, false).Run() + // _, err = calcTask.GetResult(0) + // } + // case 1: // 检查京东商品图片 + // skuNameInfo, err2 := cms.GetSkuNames(ctx, "", false, map[string]interface{}{}, 0, -1) + // if err = err2; err == nil && len(skuNameInfo.SkuNames) > 0 { + // calcTask := tasksch.NewParallelTask("检查京东图片的有效性", + // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // skuName := batchItemList[0].(*model.SkuNameExt) + // for _, sku := range skuName.Skus { + // if sku.JdID != 0 { + // skuPageInfo, err2 := api.JdAPI.GetSkuPageInfo(sku.JdID) + // if err = err2; err == nil && skuPageInfo.FixedStatus && len(skuPageInfo.Image) == 0 { + // err = fmt.Errorf("skuName:%d, sku:%d, jdid:%d, 没有图片", skuName.ID, sku.ID, sku.JdID) + // skuName.ImgHashCode = "np" + // dao.UpdateEntity(dao.GetDB(), &skuName.SkuName, "ImgHashCode") + // } + // break + // } + // } + // return retVal, err + // }, skuNameInfo.SkuNames) + // tasksch.HandleTask(calcTask, task, false).Run() + // _, err = calcTask.GetResult(0) + // } + // } + // return result, err + // }, 2) + // tasksch.HandleTask(rootTask, nil, true).Run() + // if !isAsync { + // if _, err = rootTask.GetResult(0); err == nil { + // hint = "1" + // } + // } else { + // hint = rootTask.ID + // } return hint, err } diff --git a/business/jxutils/datares/datares.go b/business/jxutils/datares/datares.go index 7949b79cf..42e3ffb5b 100644 --- a/business/jxutils/datares/datares.go +++ b/business/jxutils/datares/datares.go @@ -108,8 +108,10 @@ func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, h return dataRes, err } if imgType > 0 { - // 忽略上传错误 - UploadImage2Vendors(ctx, nil, dataRes, resBinary, isAsyncUpload2Vendor) + if globals.EnableStoreWrite { + // 忽略上传错误 + UploadImage2Vendors(ctx, nil, dataRes, resBinary, isAsyncUpload2Vendor) + } } return dataRes, err } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 726a357da..c162fe150 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -12,16 +12,10 @@ import ( ) var ( - // imgFieldMap = map[int]string{ - // model.VendorIDEBAI: "img_ebai", - // } dataResFieldMap = map[int]string{ model.VendorIDMTWM: "mtwm_url", model.VendorIDEBAI: "ebai_url", } - // descImgFieldMap = map[int]string{ - // model.VendorIDEBAI: "desc_img_ebai", - // } ) type SkuStoreCatInfo struct { diff --git a/business/model/sku.go b/business/model/sku.go index 8015321be..cee366888 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -173,13 +173,13 @@ type SkuName struct { SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性 Price int `json:"price"` // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量 - Img string `orm:"size(512)" json:"img"` - Img2 string `orm:"size(512)" json:"img2"` // 第二张图片 - ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址 - ImgHashCode string `orm:"size(255);index" json:"img_hash_code"` + Img string `orm:"size(512)" json:"img"` + Img2 string `orm:"size(512)" json:"img2"` // 第二张图片 + // ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址 + // ImgHashCode string `orm:"size(255);index" json:"img_hash_code"` - DescImg string `orm:"size(255)" json:"descImg"` // 商品详情图片描述 - DescImgEbai string `orm:"size(255)" json:"descImgEbai"` // 饿百的商品详情图片描述RTF + DescImg string `orm:"size(255)" json:"descImg"` // 商品详情图片描述 + // DescImgEbai string `orm:"size(255)" json:"descImgEbai"` // 饿百的商品详情图片描述RTF Upc string `orm:"size(20);index"` Status int `orm:"default(1)" json:"status"` // skuname状态,取值同sku.Status