From fc96161c3b1a4ffdff496fb914cda11f81d97692 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 24 Nov 2018 12:20:46 +0800 Subject: [PATCH] - remove partner.GetFieldIDName and partner.GetFieldSyncStatusName (use dao.GetXXXField instead) - mtwm.UpdateStore - mtwm.SyncStoreCategory --- business/jxstore/cms/store.go | 2 +- business/jxstore/cms/sync.go | 10 +-- business/model/const.go | 10 +-- business/model/dao/dao_utils.go | 49 +++++++++++ business/model/dao/store.go | 30 +++++++ business/model/dao/store_sku.go | 87 +++++++++++++++++++ business/model/sku.go | 1 + business/model/store.go | 7 +- business/model/store_sku.go | 6 +- business/partner/delivery/dada/waybill.go | 2 +- business/partner/partner.go | 2 - business/partner/purchase/ebai/store.go | 8 -- business/partner/purchase/elm/store.go | 8 -- business/partner/purchase/jd/store.go | 8 -- business/partner/purchase/mtwm/mtwm.go | 43 +++++++++ business/partner/purchase/mtwm/mtwm_test.go | 11 +++ business/partner/purchase/mtwm/store.go | 54 ++++++------ business/partner/purchase/mtwm/store_sku.go | 87 +++++++++++++++++++ .../partner/purchase/mtwm/store_sku_test.go | 17 ++++ business/partner/purchase/mtwm/store_test.go | 3 +- conf/app.conf | 2 + controllers/mtwm_callback.go | 10 +++ globals/globals.go | 5 +- 23 files changed, 388 insertions(+), 74 deletions(-) create mode 100644 business/model/dao/store.go create mode 100644 business/model/dao/store_sku.go create mode 100644 business/partner/purchase/mtwm/store_sku.go create mode 100644 business/partner/purchase/mtwm/store_sku_test.go create mode 100644 controllers/mtwm_callback.go diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 46baf652e..4b117ef1a 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -443,7 +443,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor storeSkuBind := &model.StoreSkuBind{} if num, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, storeSkuBind, nil, userName, map[string]interface{}{ model.FieldStoreID: storeID, - }, storeHandler.GetFieldSyncStatusName()); err != nil { + }, dao.GetSyncStatusStructField(model.VendorNames[vendorID])); err != nil { return 0, err } dao.Commit(db) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index a323bd743..2fb5db9e0 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -127,7 +127,7 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan } func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, multiStoresHandler partner.IMultipleStoresHandler, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) { - syncStatusFieldName := multiStoresHandler.GetFieldSyncStatusName() + syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) task := tasksch.NewParallelTask("syncCategories", nil, userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { cat := batchItemList[0].(*model.SkuCategory) updateFields := []string{syncStatusFieldName} @@ -136,7 +136,7 @@ func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.I err = multiStoresHandler.DeleteCategory(db, cat, userName) } else if (syncStatus & model.SyncFlagNewMask) != 0 { // 新增 err = multiStoresHandler.CreateCategory(db, cat, userName) - updateFields = append(updateFields, multiStoresHandler.GetFieldIDName()) + updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) } else if (syncStatus & model.SyncFlagModifiedMask) != 0 { // 修改 err = multiStoresHandler.UpdateCategory(db, cat, userName) } @@ -186,7 +186,7 @@ func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) if err2 == nil { cat := &model.SkuCategory{} - _, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(multiStoresHandler.GetFieldSyncStatusName(), 0), utils.Params2Map(model.FieldParentID, categoryID)) + _, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]), 0), utils.Params2Map(model.FieldParentID, categoryID)) return nil, err2 } return nil, err2 @@ -233,7 +233,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI globals.SugarLogger.Debugf("SyncSku, nameID:%d, skuID:%d, userName:%s", nameID, skuID, userName) return v.LoopMultiStoresVendors(ctx, db, "SyncSku", isAsync, userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { multiStoresHandler := v.GetMultiStoreHandler(batchItemList[0].(int)) - syncStatusFieldName := multiStoresHandler.GetFieldSyncStatusName() + syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) var skuList []*model.Sku cond := make(map[string]interface{}) if nameID != -1 { @@ -254,7 +254,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI err = multiStoresHandler.DeleteSku(db, sku, userName) } else if syncStatus&model.SyncFlagNewMask != 0 { // 新增 err = multiStoresHandler.CreateSku(db, sku, userName) - updateFields = append(updateFields, multiStoresHandler.GetFieldIDName()) + updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()])) } else if syncStatus&model.SyncFlagModifiedMask != 0 { // 修改 err = multiStoresHandler.UpdateSku(db, sku, userName) } diff --git a/business/model/const.go b/business/model/const.go index b38265fb4..3a2cf1211 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -19,12 +19,12 @@ const ( var ( VendorNames = map[int]string{ - VendorIDJD: "JD", - VendorIDMTWM: "MT", - VendorIDELM: "ELEME", - VendorIDEBAI: "EBAI", + VendorIDJD: "Jd", + VendorIDMTWM: "Mtwm", + VendorIDELM: "Elm", + VendorIDEBAI: "Ebai", VendorIDDada: "Dada", - VendorIDMTPS: "MTPS", + VendorIDMTPS: "Mtps", } VendorChineseNames = map[int]string{ VendorIDJD: "京东到家", diff --git a/business/model/dao/dao_utils.go b/business/model/dao/dao_utils.go index 189de6ebd..1ba4e65ed 100644 --- a/business/model/dao/dao_utils.go +++ b/business/model/dao/dao_utils.go @@ -2,6 +2,7 @@ package dao import ( "reflect" + "strings" "time" "git.rosy.net.cn/baseapi/utils" @@ -81,3 +82,51 @@ func GenQuestionMarks(count int) string { } return marks } + +func ConvertStructFieldPrefix(prefix string) string { + return prefix +} + +func ConvertJsonFieldPrefix(prefix string) string { + return strings.ToLower(prefix) +} + +func ConvertDBFieldPrefix(prefix string) string { + return strings.ToLower(prefix) +} + +func GetVendorThingIDStructField(prefix string) string { + return ConvertStructFieldPrefix(prefix) + "ID" +} + +func GetVendorThingIDJsonField(prefix string) string { + return ConvertJsonFieldPrefix(prefix) + "ID" +} + +func GetVendorThingIDDBField(prefix string) string { + return ConvertDBFieldPrefix(prefix) + "_id" +} + +func GetSyncStatusStructField(prefix string) string { + return ConvertStructFieldPrefix(prefix) + "SyncStatus" +} + +func GetSyncStatusJsonField(prefix string) string { + return ConvertJsonFieldPrefix(prefix) + "SyncStatus" +} + +func GetSyncStatusDBField(prefix string) string { + return ConvertDBFieldPrefix(prefix) + "_sync_status" +} + +func GetCategoryIDStructField(prefix string) string { + return ConvertStructFieldPrefix(prefix) + "CategoryID" +} + +func GetCategoryIDJsonField(prefix string) string { + return ConvertJsonFieldPrefix(prefix) + "CategoryID" +} + +func GetCategoryIDDBField(prefix string) string { + return ConvertDBFieldPrefix(prefix) + "_category_id" +} diff --git a/business/model/dao/store.go b/business/model/dao/store.go new file mode 100644 index 000000000..5782283f9 --- /dev/null +++ b/business/model/dao/store.go @@ -0,0 +1,30 @@ +package dao + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model" +) + +type StoreDetail struct { + model.Store + VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` + VendorStatus int `json:"vendor_status"` // 取值同Store.Status + DeliveryFee int `json:"deliveryFee"` + SyncStatus int8 `orm:"default(2)" json:"syncStatus"` + model.Place // district info +} + +func GetStoreDetail(db *DaoDB, storeID, vendorID int) (storeDetail *StoreDetail, err error) { + sql := ` + SELECT t2.status vendor_status, t2.vendor_store_id, t2.sync_status, district.*, t1.* + FROM store t1 + JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ? + LEFT JOIN place district ON t1.district_code = district.code + WHERE t1.id = ? AND t1.deleted_at = ? + ` + storeDetail = &StoreDetail{} + if err = GetRow(db, storeDetail, sql, vendorID, utils.DefaultTimeValue, storeID, utils.DefaultTimeValue); err == nil { + return storeDetail, nil + } + return nil, err +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go new file mode 100644 index 000000000..2cbe936b1 --- /dev/null +++ b/business/model/dao/store_sku.go @@ -0,0 +1,87 @@ +package dao + +import ( + "fmt" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model" +) + +type SkuStoreCatInfo struct { + model.SkuCategory + CatID int `orm:"column(cat_id)"` // 这个主要用于判断是否有store_sku_category_map + VendorCatID string `orm:"column(vendor_cat_id)"` + CatSyncStatus int8 + + ParentCatName string + ParentCatID int `orm:"column(parent_cat_id)"` // 这个主要用于判断是否有父store_sku_category_map + ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` + ParentCatSyncStatus int8 +} + +type StoreCatSyncInfo struct { + CatName string + Seq int `json:"seq"` + model.StoreSkuCategoryMap + + ParentCatName string + ParentCatID int `orm:"column(parent_cat_id)"` // 这个主要用于判断是否有父store_sku_category_map + ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` + ParentCatSyncStatus int8 +} + +func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int) (cats []*SkuStoreCatInfo, err error) { + sql := ` + SELECT DISTINCT t4.*, t5.category_id cat_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status, t4p.name parent_cat_name, t5p.category_id parent_cat_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status + FROM store_sku_bind t1 + JOIN sku t2 ON t1.sku_id = t2.id + JOIN sku_name t3 ON t2.name_id = t3.id + ` + if level == 2 { + sql += ` + JOIN sku_category t4 ON (t3.category_id = t4.id OR t2.category_id = t4.id) + ` + } else { + sql += ` + JOIN sku_category t4c ON (t3.category_id = t4c.id OR t2.category_id = t4c.id) + JOIN sku_category t4 ON t4.id = t4c.parent_id + ` + } + sql += ` + LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? + LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id + LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5p.store_id = t1.store_id AND t5p.deleted_at = ? + WHERE t1.store_id = ? + ` + sqlParams := []interface{}{ + storeID, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + } + if len(skuIDs) > 0 { + sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + filedPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) + sql = fmt.Sprintf(sql, filedPrefix, filedPrefix, filedPrefix, filedPrefix) + if err = GetRows(db, &cats, sql, sqlParams...); err != nil { + return nil, err + } + return cats, err +} + +func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*StoreCatSyncInfo, err error) { + filedPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) + sql := fmt.Sprintf(` + SELECT t5.*, t4.name cat_name, t4.seq, t4p.name parent_cat_name, t5p.category_id parent_cat_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status + FROM store_sku_category_map t5 + JOIN sku_category t4 ON t5.category_id = t4.id + JOIN sku_category t4p ON t4.parent_id = t4p.id + JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5p.deleted_at = ? + WHERE t5.store_id = ? AND t5.level = ? AND t5.%s_sync_status <> 0 + `, filedPrefix, filedPrefix, filedPrefix) + if err = GetRows(db, &cats, sql, utils.DefaultTimeValue, storeID, level); err != nil { + return nil, err + } + return cats, err +} diff --git a/business/model/sku.go b/business/model/sku.go index d6ce6847a..a36baac8b 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -134,6 +134,7 @@ type SkuCategory struct { JdCategoryID int `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别 ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别 EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别 + MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别 JdID int64 `orm:"column(jd_id);null" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` diff --git a/business/model/store.go b/business/model/store.go index 86abdebf3..aa3993fc7 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -165,9 +165,10 @@ type StoreMap struct { VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` Status int `json:"status"` // 取值同Store.Status - PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格 - AutoPickup int8 `orm:"default(1)" json:"autoPickup"` // 是否自动拣货 - DeliveryType int8 `orm:"default(0)" json:"deliveryType"` // 配送类型 + PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格 + AutoPickup int8 `orm:"default(1)" json:"autoPickup"` // 是否自动拣货 + DeliveryType int8 `orm:"default(0)" json:"deliveryType"` // 配送类型 + DeliveryFee int `json:"deliveryFee"` DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争 SyncStatus int8 `orm:"default(2)" json:"syncStatus"` diff --git a/business/model/store_sku.go b/business/model/store_sku.go index ec4a4cbb7..0d49ceeed 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -16,11 +16,13 @@ type StoreSkuCategoryMap struct { StoreID int `orm:"column(store_id)"` CategoryID int `orm:"column(category_id)"` - ElmID int64 `orm:"column(elm_id);index"` - EbaiID int64 `orm:"column(ebai_id);index"` + ElmID int64 `orm:"column(elm_id);index"` + EbaiID int64 `orm:"column(ebai_id);index"` + MtwmID string `orm:"column(mtwm_id);size(16)"` // 美团外卖没有ID,保存名字 ElmSyncStatus int8 EbaiSyncStatus int8 + MtwmSyncStatus int8 } func (*StoreSkuCategoryMap) TableUnique() [][]string { diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 938fd1e6d..218255f41 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -113,7 +113,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) addParams := map[string]interface{}{ "info": utils.FilterMb4(order.BuyerComment), - // "origin_mark": model.VendorNames[order.VendorID], + // "origin_mark": model.VendorChineseNames[order.VendorID], "origin_mark_no": fmt.Sprintf("%d", order.OrderSeq), "cargo_type": 13, "cargo_weight": jxutils.IntWeight2Float(order.Weight), diff --git a/business/partner/partner.go b/business/partner/partner.go index dc394fd3f..bd40b5aa8 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -90,8 +90,6 @@ type IPurchasePlatformHandler interface { RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) GetVendorID() int - GetFieldIDName() string - GetFieldSyncStatusName() string } // db *dao.DaoDB, diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index 6ede9eaf8..a9cc08f83 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -34,14 +34,6 @@ type tEbaiStoreInfo struct { DistrictID int `orm:"column(district_id)"` } -func (p *PurchaseHandler) GetFieldIDName() string { - return model.FieldEbaiID -} - -func (p *PurchaseHandler) GetFieldSyncStatusName() string { - return model.FieldEbaiSyncStatus -} - func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { var store tEbaiStoreInfo sql := ` diff --git a/business/partner/purchase/elm/store.go b/business/partner/purchase/elm/store.go index 8c1ebf995..65d792cdc 100644 --- a/business/partner/purchase/elm/store.go +++ b/business/partner/purchase/elm/store.go @@ -9,14 +9,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" ) -func (p *PurchaseHandler) GetFieldIDName() string { - return model.FieldElmID -} - -func (p *PurchaseHandler) GetFieldSyncStatusName() string { - return model.FieldElmSyncStatus -} - func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) { return nil, errors.New("饿了么还没实现") } diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index 7d289626c..3317123af 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -30,14 +30,6 @@ type tJdStoreInfo struct { SyncStatus int } -func (p *PurchaseHandler) GetFieldIDName() string { - return model.FieldJdID -} - -func (p *PurchaseHandler) GetFieldSyncStatusName() string { - return model.FieldJdSyncStatus -} - func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) { result, err := api.JdAPI.GetStoreInfoByStationNo(vendorStoreID) if err == nil { diff --git a/business/partner/purchase/mtwm/mtwm.go b/business/partner/purchase/mtwm/mtwm.go index ca06b3198..4368ef0d8 100644 --- a/business/partner/purchase/mtwm/mtwm.go +++ b/business/partner/purchase/mtwm/mtwm.go @@ -9,6 +9,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals/api" ) var ( @@ -28,6 +29,48 @@ func (c *PurchaseHandler) GetVendorID() int { return model.VendorIDMTWM } +func (p *PurchaseHandler) GetVendorCategories() (vendorCats []*model.SkuVendorCategory, err error) { + cats, err := api.MtwmAPI.RetailGetSpTagIds() + if err != nil { + return nil, err + } + vendorCatMapList := make([]map[string]*model.SkuVendorCategory, 3) + manID := 10000 + for i := 0; i < 3; i++ { + vendorCatMapList[i] = make(map[string]*model.SkuVendorCategory) + for _, v := range cats { + if utils.MustInterface2Int64(v["level"]) == 3 { + namePathList := strings.Split(strings.Trim(utils.Interface2String(v["namePath"]), ","), ",") + if len(namePathList) != 3 { + panic(fmt.Sprintf("%s没有三级结构", v["namePath"])) + } + name := namePathList[i] + if _, ok := vendorCatMapList[i][name]; !ok { + cat := &model.SkuVendorCategory{ + VendorID: model.VendorIDMTWM, + Name: utils.Interface2String(v["name"]), + Level: int(utils.MustInterface2Int64(v["level"])), + } + cat.LastOperator = "builder" + vendorCats = append(vendorCats, cat) + vendorCatMapList[i][name] = cat + if i == 2 { + cat.IsLeaf = int8(1) + cat.VendorCategoryID = utils.Int64ToStr(utils.MustInterface2Int64(v["id"])) + } else { + cat.VendorCategoryID = utils.Int2Str(manID) // 非叶子结点编码没有实际使用 + manID++ + } + if i > 0 { + cat.ParentID = vendorCatMapList[i-1][namePathList[i-1]].VendorCategoryID + } + } + } + } + } + return vendorCats, nil +} + func rangeMtwm2JX(areaStr string) string { var area []interface{} if err := utils.UnmarshalUseNumber([]byte(areaStr), &area); err == nil { diff --git a/business/partner/purchase/mtwm/mtwm_test.go b/business/partner/purchase/mtwm/mtwm_test.go index 85dc5fd7f..19463538a 100644 --- a/business/partner/purchase/mtwm/mtwm_test.go +++ b/business/partner/purchase/mtwm/mtwm_test.go @@ -1,6 +1,9 @@ package mtwm import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -16,3 +19,11 @@ func init() { beegodb.Init() api.Init() } + +func TestGetVendorCategories(t *testing.T) { + result, err := new(PurchaseHandler).GetVendorCategories() + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(result, false)) +} diff --git a/business/partner/purchase/mtwm/store.go b/business/partner/purchase/mtwm/store.go index 91215a4b2..afdca03bf 100644 --- a/business/partner/purchase/mtwm/store.go +++ b/business/partner/purchase/mtwm/store.go @@ -30,18 +30,6 @@ type tEbaiStoreInfo struct { DistrictID int `orm:"column(district_id)"` } -func (p *PurchaseHandler) GetFieldIDName() string { - return model.FieldMtwmID -} - -func (p *PurchaseHandler) GetFieldSyncStatusName() string { - return model.FieldMtwmSyncStatus -} - -func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { - return vendorStoreID, err -} - func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) { result, err := api.MtwmAPI.PoiGet(vendorStoreID) if err == nil { @@ -93,28 +81,38 @@ func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) } return nil, err } +func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (err error) { + return p.UpdateStore(db, storeID, userName) +} func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) { - type StoreAndVendorInfo struct { - model.Store - model.StoreMap - } - var store StoreAndVendorInfo - sql := ` - SELECT * - FROM store t1 - JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND (t2.deleted_at = ? OR t2.sync_status <> 0) - LEFT JOIN place city ON t1.city_code = city.code - LEFT JOIN place district ON t1.district_code = district.code - WHERE t1.id = ? - ORDER BY t2.updated_at - ` if db == nil { db = dao.GetDB() } - if err = dao.GetRow(db, &store, sql, model.VendorIDJD, utils.DefaultTimeValue, storeID); err == nil { - globals.SugarLogger.Debug(utils.Format4Output(store, false)) + storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDMTWM) + if err != nil { + return err } + openTime := [][2]int16{[2]int16{storeDetail.OpenTime1, storeDetail.CloseTime1}} + if storeDetail.OpenTime2 > 0 { + openTime = append(openTime, [2]int16{storeDetail.OpenTime2, storeDetail.CloseTime2}) + } + params := map[string]interface{}{ + "name": storeDetail.Store.Name, + "address": storeDetail.Address, + "longitude": jxutils.IntCoordinate2Standard(storeDetail.Lng), + "latitude": jxutils.IntCoordinate2Standard(storeDetail.Lat), + "phone": storeDetail.Tel1, + "shipping_fee": jxutils.IntPrice2Standard(int64(storeDetail.DeliveryFee)), + "shipping_time": openTimeJX2Mtwm(openTime), + "third_tag_name": "蔬菜", + } + params["open_level"], params["is_online"] = bizStatusJX2Mtwm(jxutils.MergeStoreStatus(storeDetail.Status, storeDetail.VendorStatus)) + globals.SugarLogger.Debug(utils.Format4Output(params, false)) + if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite { + err = api.MtwmAPI.PoiSave(utils.Int2Str(storeDetail.Store.ID), params) + } + return nil } func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { diff --git a/business/partner/purchase/mtwm/store_sku.go b/business/partner/purchase/mtwm/store_sku.go new file mode 100644 index 000000000..55fe2351a --- /dev/null +++ b/business/partner/purchase/mtwm/store_sku.go @@ -0,0 +1,87 @@ +package mtwm + +import ( + "git.rosy.net.cn/baseapi/utils" + "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/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync bool) (hint string, err error) { + userName := ctx.GetUserName() + strStoreID := utils.Int2Str(storeID) + db := dao.GetDB() + rootTask := tasksch.NewSeqTask("mtwm SyncStoreCategory", userName, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + level := step + 1 + catList, err := dao.GetStoreCategories(db, model.VendorIDMTWM, storeID, level) + task := tasksch.NewParallelTask("mtwm SyncStoreCategory2", nil, userName, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDMTWM])} + catInfo := batchItemList[0].(*dao.StoreCatSyncInfo) + if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite { + if catInfo.MtwmSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 + err = api.MtwmAPI.RetailCatDelete(strStoreID, catInfo.MtwmID) + } else if catInfo.MtwmSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增 + catName := catInfo.CatName + subCatName := "" + originName := "" + if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { + originName = catInfo.MtwmID + } + if level == 2 { + originName = catInfo.ParentCatName + catName = catInfo.ParentCatName + subCatName = catInfo.CatName + if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { + originName = catInfo.MtwmID + catName = catInfo.CatName + subCatName = "" + } + } + if catName == "" { + panic("catName is empty") + } + if err := api.MtwmAPI.RetailCatUpdate(strStoreID, originName, catName, subCatName, catInfo.Seq); err == nil { + catInfo.MtwmID = catInfo.CatName + updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDMTWM])) + } + } + } + if err == nil { + db2 := dao.GetDB() + catInfo.MtwmSyncStatus = 0 + _, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...) + } + return nil, err + }, catList) + rootTask.AddChild(task).Run() + _, err = task.GetResult(0) + return nil, err + }, 2) + tasksch.AddChild(parentTask, rootTask).Run() + if !isAsync { + _, err = rootTask.GetResult(0) + } + return rootTask.ID, err +} +func (p *PurchaseHandler) ReadStoreCategories(storeID int) (cats []*model.SkuCategory, err error) { + return nil, nil +} + +func (p *PurchaseHandler) ReadStoreSku(storeID, skuID int) (skuNameExt *model.SkuNameExt, err error) { + return nil, nil +} + +func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { + return hint, err +} + +func (p *PurchaseHandler) RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error) { + return hint, err +} + +func (p *PurchaseHandler) FullSyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync, isContinueWhenError bool) (hint string, err error) { + return hint, err +} diff --git a/business/partner/purchase/mtwm/store_sku_test.go b/business/partner/purchase/mtwm/store_sku_test.go new file mode 100644 index 000000000..2da7b38a4 --- /dev/null +++ b/business/partner/purchase/mtwm/store_sku_test.go @@ -0,0 +1,17 @@ +package mtwm + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + // _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" +) + +func TestSyncStoreCategory(t *testing.T) { + store, err := new(PurchaseHandler).SyncStoreCategory(jxcontext.AdminCtx, nil, 100077, false) + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(store, false)) +} diff --git a/business/partner/purchase/mtwm/store_test.go b/business/partner/purchase/mtwm/store_test.go index 187744681..a88b85065 100644 --- a/business/partner/purchase/mtwm/store_test.go +++ b/business/partner/purchase/mtwm/store_test.go @@ -16,9 +16,8 @@ func TestReadStore(t *testing.T) { } func TestUpdateStore(t *testing.T) { - store, err := new(PurchaseHandler).UpdateStore("4351018") + err := new(PurchaseHandler).UpdateStore(nil, 100002, "test") if err != nil { t.Fatal(err) } - t.Log(utils.Format4Output(store, false)) } diff --git a/conf/app.conf b/conf/app.conf index 47e2f2da5..b2c0fdb47 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -21,6 +21,8 @@ enableStore = true enableStoreWrite = false enableEbaiStoreWrite = false enableElmStoreWrite = true +enableMtwmStoreWrite = false + orderUseNewTable = true aliKey = "LTAI6xJUGaP6WdMQ" diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go new file mode 100644 index 000000000..e88e851a4 --- /dev/null +++ b/controllers/mtwm_callback.go @@ -0,0 +1,10 @@ +package controllers + +import ( + _ "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" + "github.com/astaxie/beego" +) + +type MtwmController struct { + beego.Controller +} diff --git a/globals/globals.go b/globals/globals.go index f7f11b38c..756edbc21 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -27,7 +27,9 @@ var ( EnableStoreWrite bool EnableEbaiStoreWrite bool EnableElmStoreWrite bool - OrderUseNewTable bool + EnableMtwmStoreWrite bool + + OrderUseNewTable bool QiniuBucket string ) @@ -56,6 +58,7 @@ func Init() { EnableStoreWrite = beego.AppConfig.DefaultBool("enableStoreWrite", false) EnableEbaiStoreWrite = beego.AppConfig.DefaultBool("enableEbaiStoreWrite", false) EnableElmStoreWrite = beego.AppConfig.DefaultBool("enableElmStoreWrite", false) + EnableMtwmStoreWrite = beego.AppConfig.DefaultBool("enableMtwmStoreWrite", false) if EnableStore { OrderUseNewTable = beego.AppConfig.DefaultBool("orderUseNewTable", false)