From 922e5175c7dfdf22dce9f81c5800aecd6108ebe7 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 8 Oct 2018 15:33:13 +0800 Subject: [PATCH] - sync store category. --- business/jxutils/tasksch/task_man.go | 6 +- business/model/dao/dao_bz.go | 7 +- business/partner/partner.go | 2 +- business/partner/purchase/ebai/ebai_test.go | 6 +- business/partner/purchase/ebai/store_sku.go | 245 +++++++++++------- .../partner/purchase/ebai/store_sku_test.go | 4 +- business/partner/purchase/elm/store_sku.go | 2 +- controllers/cms_store_sku.go | 33 ++- controllers/cms_task.go | 35 +++ routers/commentsRouter_controllers.go | 16 ++ routers/router.go | 5 + 11 files changed, 252 insertions(+), 109 deletions(-) create mode 100644 controllers/cms_task.go diff --git a/business/jxutils/tasksch/task_man.go b/business/jxutils/tasksch/task_man.go index 43e355d65..d3ead321f 100644 --- a/business/jxutils/tasksch/task_man.go +++ b/business/jxutils/tasksch/task_man.go @@ -6,7 +6,8 @@ import ( ) var ( - defTaskMan TaskMan + defTaskMan TaskMan + defLastHours = 24 ) type TaskMan struct { @@ -24,6 +25,9 @@ func (m *TaskMan) RunTask(taskName string, isContinueWhenError bool, resultHandl } func (m *TaskMan) GetTasks(taskID string, fromStatus, toStatus int, lastHours int) (taskList []*Task) { + if lastHours == 0 { + lastHours = defLastHours + } lastTime := time.Now().Add(time.Duration(-lastHours) * time.Hour).Unix() for k, v := range m.taskList { if !((taskID != "" && taskID != k) || v.Status < fromStatus || v.Status > toStatus || v.CreatedAt.Unix() < lastTime) { diff --git a/business/model/dao/dao_bz.go b/business/model/dao/dao_bz.go index 1f6827215..16be9be46 100644 --- a/business/model/dao/dao_bz.go +++ b/business/model/dao/dao_bz.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) @@ -51,9 +50,9 @@ func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, c qs = qs.Filter(k, v) } } - globals.SugarLogger.Debugf("UpdateEntityByKV befor item:%s, kvs:%s, conditions:%s", utils.Format4Output(item, false), utils.Format4Output(kvs, false), utils.Format4Output(conditions, false)) + // globals.SugarLogger.Debugf("UpdateEntityByKV befor item:%s, kvs:%s, conditions:%s", utils.Format4Output(item, false), utils.Format4Output(kvs, false), utils.Format4Output(conditions, false)) num, err = qs.Update(kvs) - globals.SugarLogger.Debugf("UpdateEntityByKV after update, num:%d", num) + // globals.SugarLogger.Debugf("UpdateEntityByKV after update, num:%d", num) return err }, reflect.TypeOf(item).Name()) return num, err @@ -71,7 +70,7 @@ func UpdateEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface }), conditions) } -// 些函数会更新同步标志 +// 此函数会更新同步标志 func UpdateEntityLogicallyAndUpdateSyncStatus(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}, syncStatusFieldName string) (num int64, err error) { if conditions != nil { conditions = utils.MergeMaps(conditions, map[string]interface{}{ diff --git a/business/partner/partner.go b/business/partner/partner.go index c849bc08e..5dd08ccb2 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -73,7 +73,7 @@ type IPurchasePlatformHandler interface { // OpenStore(vendorStoreID string, userName string) error // CloseStore(vendorStoreID, closeNotice, userName string) error - SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isForce bool, userName string) (err error) + SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isSync bool, userName string) (err error) GetFieldIDName() string GetFieldSyncStatusName() string diff --git a/business/partner/purchase/ebai/ebai_test.go b/business/partner/purchase/ebai/ebai_test.go index bc740e920..7a336ded5 100644 --- a/business/partner/purchase/ebai/ebai_test.go +++ b/business/partner/purchase/ebai/ebai_test.go @@ -9,13 +9,13 @@ import ( ) const ( - testShopBaiduID = 2233043816 - testShopID = "test_708706_63032" + testShopBaiduID = 2233909607 + testShopID = "100077" ) func init() { beego.InitBeegoBeforeTest("/Users/xujianhua/go/src/git.rosy.net.cn/jx-callback/conf/app.conf") - // beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test + beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test globals.Init() beegodb.Init() diff --git a/business/partner/purchase/ebai/store_sku.go b/business/partner/purchase/ebai/store_sku.go index 4decde42d..5f7708666 100644 --- a/business/partner/purchase/ebai/store_sku.go +++ b/business/partner/purchase/ebai/store_sku.go @@ -71,9 +71,9 @@ var ( } ) -func (p *PurchaseHandler) SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isForce bool, userName string) (err error) { +func (p *PurchaseHandler) SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isSync bool, userName string) (err error) { for _, storeID := range storeIDs { - err = p.syncOneStoreSkus(db, storeID, skuIDs, isForce, userName) + err = p.syncOneStoreSkus(db, storeID, skuIDs, isSync, userName) if err != nil { break } @@ -81,13 +81,14 @@ func (p *PurchaseHandler) SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs [] return err } -func (p *PurchaseHandler) syncOneStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int, isForce bool, userName string) (err error) { +func (p *PurchaseHandler) syncOneStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int, isSync bool, userName string) (err error) { globals.SugarLogger.Debugf("syncOneStoreSkus storeID:%d, skuIDs:%v, userName:%s", storeID, skuIDs, userName) - if err = p.syncOneStoreCategoriesFromRemote2Local(db, storeID, userName); err != nil { - return err - } - sql := ` + doThing := func() (err error) { + if err = p.syncOneStoreCategoriesFromRemote2Local(db, storeID, userName); err != nil { + return err + } + sql := ` SELECT t1.*, t2.spec_quality, t2.spec_unit, t2.weight, t2.status sku_status, t3.prefix, t3.name, t3.comment, t3.is_global, t3.unit, t3.img, t4.name cat_name, @@ -107,82 +108,86 @@ func (p *PurchaseHandler) syncOneStoreSkus(db *dao.DaoDB, storeID int, skuIDs [] WHERE t1.store_id = ? AND (t1.ebai_sync_status <> 0) ` - sqlParams := []interface{}{ - model.VendorIDEBAI, - model.VendorIDEBAI, - storeID, - } - if skuIDs != nil && len(skuIDs) > 0 { - sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" - sqlParams = append(sqlParams, skuIDs) - } - strStoreID := utils.Int2Str(storeID) - var storeSkuInfoList []*tStoreSkuFullInfo - if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil { - // globals.SugarLogger.Debug(utils.Format4Output(storeSkuInfoList, false)) - catList2Add := make(map[int]int) - for _, storeSku := range storeSkuInfoList { - if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { - if storeSku.ParentCatEbaiID == 0 { - catList2Add[storeSku.ParentCatID] = 1 - } - if storeSku.CatEbaiID == 0 { - catList2Add[storeSku.CatID] = 1 + sqlParams := []interface{}{ + model.VendorIDEBAI, + model.VendorIDEBAI, + storeID, + } + if skuIDs != nil && len(skuIDs) > 0 { + sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + strStoreID := utils.Int2Str(storeID) + var storeSkuInfoList []*tStoreSkuFullInfo + if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil { + // globals.SugarLogger.Debug(utils.Format4Output(storeSkuInfoList, false)) + catList2Add := make(map[int]int) + for _, storeSku := range storeSkuInfoList { + if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { + if storeSku.ParentCatEbaiID == 0 { + catList2Add[storeSku.ParentCatID] = 1 + } + if storeSku.CatEbaiID == 0 { + catList2Add[storeSku.CatID] = 1 + } } } - } - for k := range catList2Add { - if err = dao.AddStoreCategoryMap(db, storeID, k, model.VendorIDEBAI, "", model.SyncFlagNewMask, userName); err != nil { + for k := range catList2Add { + if err = dao.AddStoreCategoryMap(db, storeID, k, model.VendorIDEBAI, "", model.SyncFlagNewMask, userName); err != nil { + return err + } + } + if err = p.SyncOneStoreCategories(db, storeID, userName); err != nil { return err } - } - if err = p.syncOneStoreCategoriesFromLocal2Remote(db, storeID, userName); err != nil { - return err - } - if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil { - task := tasksch.RunTask("syncOneStoreSkus skus", false, nil, 0, 1, userName, func(batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - storeSku := batchItemList[0].(*tStoreSkuFullInfo) - updateFields := []string{model.FieldEbaiSyncStatus} - if storeSku.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 { - err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID)) - } else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { - // globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false)) - if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { - // todo 创建SKU后马上绑定分类,会失败,待解决 - updateFields = append(updateFields, model.FieldEbaiID) + if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil { + task := tasksch.RunManagedTask("syncOneStoreSkus skus", false, nil, 0, 1, userName, func(batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeSku := batchItemList[0].(*tStoreSkuFullInfo) + updateFields := []string{model.FieldEbaiSyncStatus} + if storeSku.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 { + err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID)) + } else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { + // globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false)) + if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { + // todo 创建SKU后马上绑定分类,会失败,待解决 + updateFields = append(updateFields, model.FieldEbaiID) + time.AfterFunc(3*time.Second, func() { + api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)) + }) + } + } else if storeSku.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 { + if _, err = api.EbaiAPI.SkuUpdate(strStoreID, storeSku.EbaiID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { + err = api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)) + } } - } else if storeSku.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 { - _, err = api.EbaiAPI.SkuUpdate(strStoreID, storeSku.EbaiID, genSkuParamsFromStoreSkuInfo(storeSku)) - } - if storeSku.EbaiSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { - time.AfterFunc(3*time.Second, func() { - api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)) - }) - } - if err == nil { - storeSku.EbaiSyncStatus = 0 - _, err = dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...) - } - return nil, err - }, storeSkuInfoList) - _, err = task.GetResult(0) + + if err == nil { + storeSku.EbaiSyncStatus = 0 + _, err = dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...) + } + return nil, err + }, storeSkuInfoList) + _, err = task.GetResult(0) + } } + return err + } + if isSync { + err = doThing() + } else { + go doThing() } return err } -func (p *PurchaseHandler) SyncStoreCategories(db *dao.DaoDB, storeIDs []int, catIDs []int) (err error) { - // sql := ` - // SELECT t1.*, t2.spec_quality, t2.spec_unit, t2.weight, - // t3.prefix, t3.name, t3.comment, t3.is_global, t3.unit, t3.img, - // t4.ebai_category_id, t4.name cat_name, t5.ebai_id cat_id, t5.ebai_category_id - // FROM store_sku_bind t1 - // JOIN sku t2 ON t1.sku_id = t2.skuIDs - // JOIN sku_name t3 ON t2.name_id = t3.id - // JOIN sku_category t4 ON t3.category_id = t4.id - // LEFT JOIN store_sku_category_map t5 ON t5.store_id = t1.store_id AND t5.category_id = t4.id - // WHERE t1.store_id = ? AND (t1.ebai_sync_status <> 0 - // ` +func (p *PurchaseHandler) SyncStoreCategories(db *dao.DaoDB, storeIDs []int, userName string) (err error) { + globals.SugarLogger.Debugf("SyncStoreCategories storeIDs:%d, userName:%s", storeIDs, userName) + + for _, storeID := range storeIDs { + if err = p.SyncOneStoreCategories(db, storeID, userName); err != nil { + break + } + } return err } @@ -301,6 +306,10 @@ func getEbaiCat(catID int64, level int) int64 { } // 从饿百同步分类信息到本地 +// 些函数执行后: +// 远程有与本地有的条目会关联(并置标记,下次同步会刷新远程) +// 远程没有本地有的条目会标记新增 +// 远程有本地没有的条目不做处理 func (p *PurchaseHandler) syncOneStoreCategoriesFromRemote2Local(db *dao.DaoDB, storeID int, userName string) (err error) { globals.SugarLogger.Debugf("syncOneStoreCategoriesFromRemote2Local storeID:%d, userName:%s", storeID, userName) @@ -316,6 +325,7 @@ func (p *PurchaseHandler) syncOneStoreCategoriesFromRemote2Local(db *dao.DaoDB, cat1Map := map[string]*tStoreCatInfo{} for _, v := range catList { v.Name = utils.FilterMb4(v.Name) + globals.SugarLogger.Debug(v.Name) if v.Level == 1 { cat1 := cat1Map[v.Name] if cat1 == nil { @@ -330,27 +340,19 @@ func (p *PurchaseHandler) syncOneStoreCategoriesFromRemote2Local(db *dao.DaoDB, } cat1.Children[v.Name] = v } + v.EbaiSyncStatus |= model.SyncFlagNewMask } if result, err := api.EbaiAPI.ShopCategoryGet(utils.Int2Str(storeID)); err == nil { - for _, v := range result { - jxCat := cat1Map[v.Name] - if jxCat == nil { // 远程有,本地没有,非法类别 - - } else { - if jxCat.EbaiID != v.CategoryID || utils.Int2Str(jxCat.CatID) != v.ShopCustomID { - if jxCat.ID == 0 { // 远程有,本门店没有 - globals.SugarLogger.Debug(jxCat.CatID) - err = dao.AddStoreCategoryMap(db, storeID, jxCat.CatID, model.VendorIDEBAI, utils.Int64ToStr(v.CategoryID), model.SyncFlagModifiedMask, userName) - } else { // 远程有,本门店有,但ID信息不一致 - err = dao.AddStoreCategoryMap(db, storeID, jxCat.CatID, model.VendorIDEBAI, utils.Int64ToStr(v.CategoryID), model.SyncFlagModifiedMask, userName) - } - } else { // 两边都有,且信息一致 - - } - } - if err != nil { - return err - } + dao.Begin(db) + defer func() { + dao.Rollback(db) + }() + // globals.SugarLogger.Debug(utils.Format4Output(cat1Map, false)) + if err = p.processLocalCatByRemote(db, storeID, cat1Map, result, userName); err == nil { + err = p.updateLocalCatAsNew(db, cat1Map, userName) + } + if err == nil { + dao.Commit(db) } } } @@ -359,8 +361,8 @@ func (p *PurchaseHandler) syncOneStoreCategoriesFromRemote2Local(db *dao.DaoDB, // 从本地同步分类信息到饿百 // 测试过程中出现过,父分类创建成功后马上创建子分类会报没有父分类错 -func (p *PurchaseHandler) syncOneStoreCategoriesFromLocal2Remote(db *dao.DaoDB, storeID int, userName string) (err error) { - globals.SugarLogger.Debugf("syncOneStoreCategoriesFromLocal2Remote storeID:%d, userName:%s", storeID, userName) +func (p *PurchaseHandler) SyncOneStoreCategories(db *dao.DaoDB, storeID int, userName string) (err error) { + globals.SugarLogger.Debugf("SyncOneStoreCategories storeID:%d, userName:%s", storeID, userName) for level := 1; level <= 2; level++ { sql := ` @@ -387,13 +389,13 @@ func (p *PurchaseHandler) syncOneStoreCategoriesFromLocal2Remote(db *dao.DaoDB, if catInfo.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 err = api.EbaiAPI.ShopCategoryDelete(strStoreID, catInfo.EbaiID) } else if catInfo.EbaiSyncStatus&model.SyncFlagNewMask != 0 { // 新增 - ebaiID, err2 := api.EbaiAPI.ShopCategoryCreate(strStoreID, catInfo.ParentEbaiID, utils.FilterMb4(catInfo.Name), int(catInfo.Seq+1), utils.Int2Str(catInfo.ID)) + ebaiID, err2 := api.EbaiAPI.ShopCategoryCreate(strStoreID, catInfo.ParentEbaiID, utils.FilterMb4(catInfo.Name), int(catInfo.Seq+1), utils.Int2Str(catInfo.CategoryID)) if err = err2; err == nil { catInfo.EbaiID = ebaiID updateFields = append(updateFields, model.FieldEbaiID) } } else if catInfo.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 { // 修改 - err = api.EbaiAPI.ShopCategoryUpdate(strStoreID, catInfo.EbaiID, utils.FilterMb4(catInfo.Name), int(catInfo.Seq+1), utils.Int2Str(catInfo.ID)) + err = api.EbaiAPI.ShopCategoryUpdate(strStoreID, catInfo.EbaiID, utils.FilterMb4(catInfo.Name), int(catInfo.Seq+1), utils.Int2Str(catInfo.CategoryID)) } if err == nil { catInfo.EbaiSyncStatus = 0 @@ -406,3 +408,54 @@ func (p *PurchaseHandler) syncOneStoreCategoriesFromLocal2Remote(db *dao.DaoDB, } return err } + +func (p *PurchaseHandler) processLocalCatByRemote(db *dao.DaoDB, storeID int, localCatMap map[string]*tStoreCatInfo, remoteCatList []*ebaiapi.CategoryInfo, userName string) (err error) { + if localCatMap == nil || remoteCatList == nil { + return nil + } + for _, v := range remoteCatList { + jxCat := localCatMap[v.Name] + if jxCat == nil { // 远程有,本地没有,非法类别 + globals.SugarLogger.Debug(v.Name) + globals.SugarLogger.Debug(utils.Format4Output(localCatMap, false)) + } else { + if jxCat.EbaiID != v.CategoryID || utils.Int2Str(jxCat.CatID) != v.ShopCustomID { + if jxCat.ID == 0 { // 远程有,本门店没有 + globals.SugarLogger.Debug(jxCat.CatID) + err = dao.AddStoreCategoryMap(db, storeID, jxCat.CatID, model.VendorIDEBAI, utils.Int64ToStr(v.CategoryID), model.SyncFlagModifiedMask, userName) + } else { // 远程有,本门店有,但ID信息不一致 + _, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, &jxCat.StoreSkuCategoryMap, map[string]interface{}{ + model.FieldEbaiID: v.CategoryID, + }, userName, nil, model.FieldEbaiSyncStatus) + } + } else { // 两边都有,且信息一致 + } + jxCat.EbaiSyncStatus = 0 + if err = p.processLocalCatByRemote(db, storeID, jxCat.Children, v.Children, userName); err != nil { + return err + } + } + if err != nil { + return err + } + } + return nil +} + +func (p *PurchaseHandler) updateLocalCatAsNew(db *dao.DaoDB, localCatMap map[string]*tStoreCatInfo, userName string) (err error) { + if localCatMap == nil { + return nil + } + for _, v := range localCatMap { + if v.EbaiSyncStatus&model.SyncFlagNewMask != 0 { + dao.WrapUpdateULEntity(&v.StoreSkuCategoryMap, userName) + if _, err = dao.UpdateEntity(db, &v.StoreSkuCategoryMap); err != nil { + return err + } + } + if err = p.updateLocalCatAsNew(db, v.Children, userName); err != nil { + return err + } + } + return nil +} diff --git a/business/partner/purchase/ebai/store_sku_test.go b/business/partner/purchase/ebai/store_sku_test.go index 07a6b5bf5..9f81c6532 100644 --- a/business/partner/purchase/ebai/store_sku_test.go +++ b/business/partner/purchase/ebai/store_sku_test.go @@ -2,6 +2,7 @@ package ebai import ( "testing" + "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model/dao" @@ -13,6 +14,7 @@ func TestSyncStoreSkus(t *testing.T) { if err != nil { t.Fatal(err.Error()) } + time.Sleep(5 * time.Second) } func TestSyncOneStoreCategoriesFromRemote2Local(t *testing.T) { @@ -25,7 +27,7 @@ func TestSyncOneStoreCategoriesFromRemote2Local(t *testing.T) { func TestSyncOneStoreCategoriesFromLocal2Remote(t *testing.T) { db := dao.GetDB() - err := new(PurchaseHandler).syncOneStoreCategoriesFromLocal2Remote(db, 100077, "autotest") + err := new(PurchaseHandler).SyncOneStoreCategories(db, 100077, "autotest") if err != nil { t.Fatal(err.Error()) } diff --git a/business/partner/purchase/elm/store_sku.go b/business/partner/purchase/elm/store_sku.go index 65ce18ab3..015b5e187 100644 --- a/business/partner/purchase/elm/store_sku.go +++ b/business/partner/purchase/elm/store_sku.go @@ -16,6 +16,6 @@ func (p *PurchaseHandler) ReadStoreSku(storeID, skuID int) (skuNameExt *model.Sk return nil, nil } -func (p *PurchaseHandler) SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isForce bool, userName string) (err error) { +func (p *PurchaseHandler) SyncStoreSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isSync bool, userName string) (err error) { return nil } diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 9af9becb1..cb540feb6 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -2,7 +2,9 @@ package controllers import ( "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch" "git.rosy.net.cn/jx-callback/business/jxstore/cms" + "git.rosy.net.cn/jx-callback/business/model/dao" "github.com/astaxie/beego" ) @@ -41,7 +43,7 @@ func (c *StoreSkuController) GetStoreSkus() { // @Description 修改商家商品绑定 // @Param token header string true "认证token" // @Param storeID formData int true "需要修改的商品名ID,payload中的相应数据会被忽略" -// @Param payload formData string true "json数据,StoreSkuBindInfo对象 +// @Param payload formData string true "json数据,StoreSkuBindInfo对象" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /UpdateStoreSku [put] @@ -59,7 +61,7 @@ func (c *StoreSkuController) UpdateStoreSku() { // @Description 批量修改商家商品绑定 // @Param token header string true "认证token" // @Param storeID formData int true "需要修改的商品名ID,payload中的相应数据会被忽略" -// @Param payload formData string true "json数据,StoreSkuBindInfo对象数组 +// @Param payload formData string true "json数据,StoreSkuBindInfo对象数组" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /UpdateStoreSkus [put] @@ -72,3 +74,30 @@ func (c *StoreSkuController) UpdateStoreSkus() { return retVal, "", err }) } + +// @Title 同步商家商品信息 +// @Description 同步商家商品信息,单店模式厂商才支持 +// @Param token header string true "认证token" +// @Param storeIDs formData string true "门店ID列表" +// @Param vendorID formData int true "厂商ID" +// @Param isSync formData bool true "是否同步操作" +// @Param skuIDs formData string false "SKU ID列表,缺省为全部" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SyncStoreSkus [put] +func (c *StoreSkuController) SyncStoreSkus() { + c.callSyncStoreSkus(func(params *tStoreSkuSyncStoreSkusParams) (retVal interface{}, errCode string, err error) { + db := dao.GetDB() + var storeIDs []int + var skuIDs []int + if err = utils.UnmarshalUseNumber([]byte(params.StoreIDs), &storeIDs); err == nil { + if params.SkuIDs != "" { + err = utils.UnmarshalUseNumber([]byte(params.SkuIDs), &skuIDs) + } + if err == nil { + err = basesch.FixedBaseScheduler.GetPurchasePlatformFromVendorID(params.VendorID).SyncStoreSkus(db, storeIDs, skuIDs, params.IsSync, GetUserNameFromToken(params.Token)) + } + } + return retVal, "", err + }) +} diff --git a/controllers/cms_task.go b/controllers/cms_task.go new file mode 100644 index 000000000..64ee566dc --- /dev/null +++ b/controllers/cms_task.go @@ -0,0 +1,35 @@ +package controllers + +import ( + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "github.com/astaxie/beego" +) + +type TaskController struct { + beego.Controller +} + +// @Title 查询长时间运行任务 +// @Description 查询长时间运行任务 +// @Param token header string true "认证token" +// @Param taskID query string false "任务ID" +// @Param fromStatus query int false "起始状态" +// @Param toStatus query int false "结束状态" +// @Param lastHours query int false "多少小时以内的" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetTasks [get] +func (c *TaskController) GetTasks() { + c.callGetTasks(func(params *tTaskGetTasksParams) (retVal interface{}, errCode string, err error) { + if params.MapData["fromStatus"] == nil { + params.FromStatus = tasksch.TaskStatusBegin + if params.MapData["toStatus"] == nil { + params.ToStatus = tasksch.TaskStatusEnd + } + } else if params.MapData["toStatus"] == nil { + params.ToStatus = params.FromStatus + } + retVal = tasksch.GetTasks(params.TaskID, params.FromStatus, params.ToStatus, params.LastHours) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 7fdf745ab..1c42d193d 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -415,6 +415,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "SyncStoreSkus", + Router: `/SyncStoreSkus`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], beego.ControllerComments{ Method: "UpdateStoreSku", @@ -431,6 +439,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"], + beego.ControllerComments{ + Method: "GetTasks", + Router: `/GetTasks`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], beego.ControllerComments{ Method: "TmpAddMobile2Mobile", diff --git a/routers/router.go b/routers/router.go index 7ab5ed621..ea6f0add7 100644 --- a/routers/router.go +++ b/routers/router.go @@ -51,6 +51,11 @@ func init() { &controllers.StoreSkuController{}, ), ), + beego.NSNamespace("/task", + beego.NSInclude( + &controllers.TaskController{}, + ), + ), ) beego.AddNamespace(ns)