From 9df7461b5b4efcef4fff148b62f0aff7ae82e83a Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 2 Jul 2019 13:36:16 +0800 Subject: [PATCH] - ebai.SyncAct --- business/jxstore/act/act.go | 25 ++- business/jxstore/act/act_test.go | 34 ++-- business/partner/purchase/ebai/act.go | 267 +++++++++++++++++++------- business/partner/purchase/jd/act.go | 12 +- 4 files changed, 244 insertions(+), 94 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index a991d57a5..7ce56b38c 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -165,8 +165,27 @@ func AddActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActStoreS if err != nil { return err } - - err = addActStoreBind(ctx, db, actStoreSkuList, actStoreSkuMapList) + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + if err = addActStoreBind(ctx, db, actStoreSkuList, actStoreSkuMapList); err != nil { + return err + } + for _, act := range actMap { + if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), + map[string]interface{}{ + model.FieldSyncStatus: act.SyncStatus | model.SyncFlagModifiedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } + dao.Commit(db) return err } @@ -194,7 +213,7 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules } var actMapList []*model.ActMap - for vendorID := range validVendorIDs { + for _, vendorID := range validVendorIDs { actMap := &model.ActMap{ ActID: act.ID, VendorID: vendorID, diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index 00b860feb..ed26918d1 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -29,29 +29,29 @@ func TestCreateAct(t *testing.T) { actID, err := CreateAct(jxcontext.AdminCtx, &model.Act{ Name: "测试活动", PricePercentage: 80, - }, []int{0}, nil, []*ActStoreSkuParam{ + }, []int{model.VendorIDEBAI}, nil, []*ActStoreSkuParam{ &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100119, - SkuID: 30828, + StoreID: 100884, + SkuID: 22716, }, }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100119, - SkuID: 30827, + StoreID: 100884, + SkuID: 22717, }, }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 30592, + StoreID: 100920, + SkuID: 22714, }, }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 30565, + StoreID: 100920, + SkuID: 22715, }, }, }) @@ -84,14 +84,14 @@ func TestDeleteActStoreBind(t *testing.T) { // }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 30592, + StoreID: 100884, + SkuID: 22716, }, }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 30565, + StoreID: 100884, + SkuID: 22717, }, }, }) @@ -116,14 +116,14 @@ func TestAddActStoreBind(t *testing.T) { // }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 30592, + StoreID: 100884, + SkuID: 22716, }, }, &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 30565, + StoreID: 100884, + SkuID: 22717, }, }, }) diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index e20faed53..f80032ab5 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -7,6 +7,7 @@ import ( "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" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -72,12 +73,15 @@ func act2EbaiActivity(act *model.Act2, actOrderRules []*model.ActOrderRule) (act ActivityDesc: act.Advertising, ShowCategory: act.Name, PromotionSkuDesc: act.Name, - Rule: actOrderRules2Ebai(actOrderRules), + } + if actOrderRules != nil { + activity.Rule = actOrderRules2Ebai(actOrderRules) } return activity } func createOneShopAct(shopID string, activity *ebaiapi.ActivityInfo, oneStoreActSku []*model.ActStoreSku2) (ebaiActIDStr string, err error) { + globals.SugarLogger.Debugf("ebai createOneShopAct") if globals.EnableEbaiStoreWrite { ebaiActID, err := api.EbaiAPI.ActivityCreate(shopID, 0, 0, activity) if err == nil { @@ -91,88 +95,215 @@ func createOneShopAct(shopID string, activity *ebaiapi.ActivityInfo, oneStoreAct } func ActivitySkuAddBatch(activityID int64, shopID string, baiduShopID int64, activityType int, skuList []*ebaiapi.ActivitySkuInfo4Add, isSkuIDCustom bool) (successIDs []string, err error) { - return api.EbaiAPI.ActivitySkuAddBatch(activityID, shopID, baiduShopID, activityType, skuList, isSkuIDCustom) + globals.SugarLogger.Debugf("ebai ActivitySkuAddBatch") + if globals.EnableEbaiStoreWrite { + successIDs, err = api.EbaiAPI.ActivitySkuAddBatch(activityID, shopID, baiduShopID, activityType, skuList, isSkuIDCustom) + } + return successIDs, err } func ActivitySkuDeleteBatch(activityID int64, shopID string, baiduShopID int64, skuIDs []string, isSkuIDCustom bool) (successIDs []string, err error) { - return api.EbaiAPI.ActivitySkuDeleteBatch(activityID, shopID, baiduShopID, skuIDs, isSkuIDCustom) + globals.SugarLogger.Debugf("ebai ActivitySkuDeleteBatch") + if globals.EnableEbaiStoreWrite { + successIDs, err = api.EbaiAPI.ActivitySkuDeleteBatch(activityID, shopID, baiduShopID, skuIDs, isSkuIDCustom) + } + return successIDs, err } func ActivitySkuUpdateBatch(activityID int64, actSkuInfoList []*ebaiapi.ActivitySkuInfo4Update) (faildInfoList []string, err error) { - return api.EbaiAPI.ActivitySkuUpdateBatch(activityID, actSkuInfoList) + globals.SugarLogger.Debugf("ebai ActivitySkuUpdateBatch") + if globals.EnableEbaiStoreWrite { + faildInfoList, err = api.EbaiAPI.ActivitySkuUpdateBatch(activityID, actSkuInfoList) + } + return faildInfoList, err } -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { - activity := act2EbaiActivity(act, actOrderRules) - if act.Type < model.ActOrderBegin { - actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku) - task := tasksch.NewParallelTask("ebai CreateAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - list := batchItemList[0].([]*model.ActStoreSku2) - var vendorActID string - vendorActID, err = createOneShopAct(utils.Int2Str(list[0].StoreID), activity, list) - for _, v := range list { - v.VendorActID = vendorActID - } - return nil, err - }, actStoreSkuListList) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - +func ActivityDisable(activityID int64, shopID string, baiduShopID, supplierID int64) (err error) { + globals.SugarLogger.Debugf("ebai ActivityDisable") + if globals.EnableEbaiStoreWrite { + err = api.EbaiAPI.ActivityDisable(activityID, shopID, baiduShopID, supplierID) } return err } -func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { - // if act.Type < model.ActOrderBegin { - // actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) - // task := tasksch.NewParallelTask("ebai UpdateAct", nil, ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // v := batchItemList[0].(*model.ActStore2) - // if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { - // if list := actStoreSu2Ebai4Delete(storeSkus); len(list) > 0 { - // if _, err = ActivitySkuDeleteBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, list, false); err != nil { - // return nil, err - // } - // } - // if list := actStoreSu2Ebai4Add(storeSkus); len(list) > 0 { - // if _, err = ActivitySkuAddBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, actType2Ebai(act.Type), list, false); err != nil { - // return nil, err - // } - // } - // if list := actStoreSu2Ebai4Update(storeSkus); len(list) > 0 { - // if _, err = ActivitySkuUpdateBatch(utils.Str2Int64(v.VendorActID), list); err != nil { - // return nil, err - // } - // } - // } - // return nil, err - // }, actStoreMap2Update) - // tasksch.HandleTask(task, parentTask, true).Run() - // _, err = task.GetResult(0) - // } else { - - // } - return err +func getActStoreSkuFromTaskResult(taskReslt []interface{}) (list []*model.ActStoreSku2) { + for _, v := range taskReslt { + actStoreSkuList := v.([]*model.ActStoreSku2) + list = append(list, actStoreSkuList...) + } + return list } -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) { - // if act.Type < model.ActOrderBegin { - // task := tasksch.NewParallelTask("ebai DeleteAct", nil, ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // v := batchItemList[0].(*model.ActStore2) - // if globals.EnableEbaiStoreWrite { - // err = api.EbaiAPI.ActivityDisable(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, 0) - // } - // return nil, err - // }, actStoreMap) - // tasksch.HandleTask(task, parentTask, true).Run() - // _, err = task.GetResult(0) - // } - return err +func createSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (createdList []*model.ActStoreSku2, err error) { + globals.SugarLogger.Debugf("ebai createSkuAct") + activity := act2EbaiActivity(act, nil) + actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku) + task := tasksch.NewParallelTask("ebai createSkuAct", nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + list := batchItemList[0].([]*model.ActStoreSku2) + var vendorActID string + if vendorActID, err = createOneShopAct(utils.Int2Str(list[0].StoreID), activity, list); err == nil { + for _, v := range list { + v.VendorActID = vendorActID + } + retVal = []interface{}{list} + } + return retVal, err + }, actStoreSkuListList) + tasksch.HandleTask(task, parentTask, true).Run() + result, err := task.GetResult(0) + return getActStoreSkuFromTaskResult(result), err +} + +func cancelSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, actStoreSkuMap map[string][]*model.ActStoreSku2) (canceledList []*model.ActStoreSku2, err error) { + globals.SugarLogger.Debugf("ebai cancelSkuAct") + var vendorActIDs []string + for k := range actStoreSkuMap { + vendorActIDs = append(vendorActIDs, k) + } + task := tasksch.NewParallelTask("ebai cancelSkuAct", nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + vendorActID := batchItemList[0].(string) + actStoreSkuList := actStoreSkuMap[vendorActID] + if err = ActivityDisable(utils.Str2Int64(vendorActID), utils.Int2Str(actStoreSkuList[0].StoreID), 0, 0); err == nil { + retVal = []interface{}{actStoreSkuList} + } + return retVal, err + }, vendorActIDs) + tasksch.HandleTask(task, parentTask, true).Run() + result, err := task.GetResult(0) + return getActStoreSkuFromTaskResult(result), err +} + +func deleteSkuActSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, actStoreSkuMap, vendorActInfoMap map[string][]*model.ActStoreSku2) (deletedList []*model.ActStoreSku2, err error) { + globals.SugarLogger.Debugf("ebai deleteSkuActSkus") + var vendorActIDs []string + for k := range actStoreSkuMap { + if k != "" { + vendorActIDs = append(vendorActIDs, k) + } + } + if len(vendorActIDs) > 0 { + task := tasksch.NewParallelTask("ebai deleteSkuAct", nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + vendorActID := batchItemList[0].(string) + actStoreSkuList := actStoreSkuMap[vendorActID] + vendorActStoreSkuList := vendorActInfoMap[vendorActID] + if len(actStoreSkuList) < len(vendorActStoreSkuList) { + if list := actStoreSu2Ebai4Delete(actStoreSkuList); len(list) > 0 { + _, err = ActivitySkuDeleteBatch(utils.Str2Int64(vendorActID), utils.Int2Str(actStoreSkuList[0].StoreID), 0, list, false) + } + } else { + err = ActivityDisable(utils.Str2Int64(vendorActID), utils.Int2Str(actStoreSkuList[0].StoreID), 0, 0) + } + if err == nil { + retVal = []interface{}{actStoreSkuList} + } + return retVal, err + }, vendorActIDs) + tasksch.HandleTask(task, parentTask, true).Run() + result, err2 := task.GetResult(0) + err = err2 + deletedList = getActStoreSkuFromTaskResult(result) + } + return deletedList, err +} + +func addSkuActSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2, vendorActIDMap map[int]string) (addedList []*model.ActStoreSku2, err error) { + globals.SugarLogger.Debugf("ebai addSkuActSkus, actID:%d", act.ID) + actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku) + if len(actStoreSkuListList) > 0 { + task := tasksch.NewParallelTask("ebai addSkuActSkus", nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + actStoreSkuList := batchItemList[0].([]*model.ActStoreSku2) + vendorActID := vendorActIDMap[actStoreSkuList[0].StoreID] + if vendorActID != "" { + if list := actStoreSu2Ebai4Add(actStoreSkuList); len(list) > 0 { + _, err = ActivitySkuAddBatch(utils.Str2Int64(vendorActID), utils.Int2Str(actStoreSkuList[0].StoreID), 0, actType2Ebai(act.Type), list, false) + } + } else { + activity := act2EbaiActivity(act, nil) + vendorActID, err = createOneShopAct(utils.Int2Str(actStoreSkuList[0].StoreID), activity, actStoreSkuList) + } + if err == nil { + for _, v := range actStoreSkuList { + v.VendorActID = vendorActID + } + retVal = []interface{}{actStoreSkuList} + } + return retVal, err + }, actStoreSkuListList) + tasksch.HandleTask(task, parentTask, true).Run() + result, err2 := task.GetResult(0) + err = err2 + addedList = getActStoreSkuFromTaskResult(result) + } + return addedList, err } func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { - return nil + globals.SugarLogger.Debugf("ebai SyncAct, actID:%d", act.ID) + vendorActInfoMap := make(map[string][]*model.ActStoreSku2) + deleteActInfoMap := make(map[string][]*model.ActStoreSku2) + vendorActIDMap := make(map[int]string) + var actStoreSkuList4Create []*model.ActStoreSku2 + var updateItems []*dao.KVUpdateItem + + actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuList) + for storeID := range actStoreSkuMap { + for _, actStoreSku := range actStoreSkuMap[storeID] { + vendorActInfoMap[actStoreSku.VendorActID] = append(vendorActInfoMap[actStoreSku.VendorActID], actStoreSku) + if vendorActIDMap[storeID] == "" && actStoreSku.VendorActID != "" { + vendorActIDMap[storeID] = actStoreSku.VendorActID + } + if model.IsSyncStatusNeedCreate(actStoreSku.SyncStatus) { + actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) + } else if model.IsSyncStatusNeedDelete(actStoreSku.SyncStatus) { + vendorActID := actStoreSku.VendorActID + if vendorActID == "" { + vendorActID = act.VendorActID + } + deleteActInfoMap[vendorActID] = append(deleteActInfoMap[vendorActID], actStoreSku) + } + } + } + err = func() (err error) { + if model.IsSyncStatusNeedCreate(act.SyncStatus) { + createdList, err2 := createSkuAct(ctx, nil, act, actStoreSkuList4Create) + updateItems = append(updateItems, partner.ActStoreSku2Update(createdList, model.SyncFlagNewMask)...) + if err = err2; err == nil { + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagNewMask)) + } + } else if model.IsSyncStatusNeedDelete(act.SyncStatus) { + canceledList, err2 := cancelSkuAct(ctx, nil, vendorActInfoMap) + updateItems = append(updateItems, partner.ActStoreSku2Update(canceledList, model.SyncFlagDeletedMask)...) + if err = err2; err == nil { + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagDeletedMask)) + } + } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { + // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) + if len(actStoreSkuList4Create) > 0 { + addedList, err2 := addSkuActSkus(ctx, nil, act, actStoreSkuList4Create, vendorActIDMap) + updateItems = append(updateItems, partner.ActStoreSku2Update(addedList, model.SyncFlagNewMask)...) + if err = err2; err != nil { + return err + } + } + if len(deleteActInfoMap) > 0 { + deletedList, err2 := deleteSkuActSkus(ctx, nil, deleteActInfoMap, vendorActInfoMap) + updateItems = append(updateItems, partner.ActStoreSku2Update(deletedList, model.SyncFlagDeletedMask)...) + if err = err2; err != nil { + return err + } + } + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) + } + return nil + }() + db := dao.GetDB() + _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) + if err == nil { + err = err2 + } + return err } diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 2b3732df7..afd14435b 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -205,6 +205,12 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagDeletedMask)) } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) + if len(actStoreSkuList4Create) > 0 { + if _, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + return err + } + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) + } for vendorActID := range deleteActInfoMap { if vendorActID != "" { if len(vendorActInfoMap[vendorActID]) == len(deleteActInfoMap[vendorActID]) { @@ -218,12 +224,6 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa } updateItems = append(updateItems, partner.ActStoreSku2Update(deleteActInfoMap[vendorActID], model.SyncFlagDeletedMask)...) } - if len(actStoreSkuList4Create) > 0 { - if _, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { - return err - } - updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) - } updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) } return nil