From 29d358af5ea2bf700132ba1782e61d59dc8141c3 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 30 Aug 2018 15:22:26 +0800 Subject: [PATCH] - jd basic api(category, sku, store management) finished. --- business/jxstore/skuman/skuman.go | 14 -- business/model/dao/dao.go | 48 +++++ business/model/dao/sku.go | 20 -- business/model/dao/store.go | 20 -- business/model/product.go | 17 +- business/model/store.go | 36 ++-- business/partner/purchase/jd/jd.go | 10 +- business/partner/purchase/jd/order_test.go | 4 +- business/partner/purchase/jd/product.go | 206 +++++++++++++++++++ business/partner/purchase/jd/product_test.go | 56 +++++ business/partner/purchase/jd/store.go | 63 +++++- business/partner/purchase/jd/store_test.go | 77 +++++++ 12 files changed, 485 insertions(+), 86 deletions(-) create mode 100644 business/model/dao/dao.go delete mode 100644 business/model/dao/sku.go delete mode 100644 business/model/dao/store.go create mode 100644 business/partner/purchase/jd/product.go create mode 100644 business/partner/purchase/jd/product_test.go create mode 100644 business/partner/purchase/jd/store_test.go diff --git a/business/jxstore/skuman/skuman.go b/business/jxstore/skuman/skuman.go index 8dd693da4..b3786c138 100644 --- a/business/jxstore/skuman/skuman.go +++ b/business/jxstore/skuman/skuman.go @@ -2,7 +2,6 @@ package skuman import ( "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" ) const ( @@ -18,16 +17,3 @@ func New(sku *model.Sku) *Sku { Sku: sku, } } - -func GetJdCategoryID(sku *model.Sku) int { - cat, _ := dao.GetCategory(sku.CategoryID, nil) - jdCategoryID := defJdCategoryID - if cat != nil && cat.JdCategoryID != 0 { - jdCategoryID = cat.JdCategoryID - } - return jdCategoryID -} - -func GetCategories(sku *model.Sku) []int { - return nil -} diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go new file mode 100644 index 000000000..ae91610a7 --- /dev/null +++ b/business/model/dao/dao.go @@ -0,0 +1,48 @@ +package dao + +import ( + "reflect" + + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals/gormdb" + "github.com/jinzhu/gorm" +) + +func GetEntity(item interface{}, db *gorm.DB) error { + if db == nil { + db = gormdb.GetDB() + } + err := utils.CallFuncLogError(func() error { + return db.First(item).Error + }, reflect.TypeOf(item).Name()) + return err +} + +func GetSellCities(skuNameID int, vendorID int, db *gorm.DB) (cities []*model.Place, err error) { + if db == nil { + db = gormdb.GetDB() + } + sql := ` + SELECT DISTINCT t3.* + FROM sku_name_place_bind t1 + JOIN place t2 ON t1.place_code = t2.code + JOIN place t3 ON (t2.level = 2 AND t2.code = t3.code) OR (t2.level = 1 AND t2.code = t3.parent_code) + WHERE t1.sku_name_id = ? + ` + if vendorID == model.VendorIDJD { + sql += "AND t3.jd_code <> 0\n" + } + rows, err := db.Raw(sql, skuNameID).Rows() + if err == nil { + defer rows.Close() + places := make([]*model.Place, 0) + for rows.Next() { + place := new(model.Place) + db.ScanRows(rows, place) + places = append(places, place) + } + return places, nil + } + return nil, err +} diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go deleted file mode 100644 index 9a2615c1c..000000000 --- a/business/model/dao/sku.go +++ /dev/null @@ -1,20 +0,0 @@ -package dao - -import ( - "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/globals/gormdb" - "github.com/jinzhu/gorm" -) - -func GetCategory(ID int, db *gorm.DB) (*model.SkuCategory, error) { - if db == nil { - db = gormdb.GetDB() - } - item := &model.SkuCategory{} - item.ID = ID - err := utils.CallFuncLogError(func() error { - return db.First(item).Error - }, "GetCategory") - return item, err -} diff --git a/business/model/dao/store.go b/business/model/dao/store.go deleted file mode 100644 index 9c8650b61..000000000 --- a/business/model/dao/store.go +++ /dev/null @@ -1,20 +0,0 @@ -package dao - -import ( - "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/globals/gormdb" - "github.com/jinzhu/gorm" -) - -func GetStore(ID int, db *gorm.DB) (*model.Store, error) { - if db == nil { - db = gormdb.GetDB() - } - item := &model.Store{} - item.ID = ID - err := utils.CallFuncLogError(func() error { - return db.First(item).Error - }, "GetStore") - return item, err -} diff --git a/business/model/product.go b/business/model/product.go index c5479d562..129aed414 100644 --- a/business/model/product.go +++ b/business/model/product.go @@ -63,9 +63,9 @@ type SkuCategory struct { Type int8 // 类别类型 Seq int - JdID int `gorm:"index"` // 这个是指商家自己的商品类别在京东平台上的ID + JdID int64 `gorm:"index"` // 这个是指商家自己的商品类别在京东平台上的ID JdCategoryID int // 这个是指对应的京东商品类别 - ElmID string `gorm:"type:varchar(48);index"` + ElmID int64 `gorm:"index"` MtID string `gorm:"type:varchar(48);index"` DidiID string `gorm:"type:varchar(48);index"` } @@ -84,6 +84,7 @@ type SkuName struct { Name string `gorm:"type:varchar(255)"` Comment string `gorm:"type:varchar(255)"` + BrandID int CategoryID int // 标准类别 Status int @@ -99,17 +100,16 @@ type Sku struct { CategoryID int // 特殊类别,一般用于秒杀,特价之类的特殊类别 NameID int `gorm:"index:unique_index_name_Id_quality"` // todo 这个索引应该要求唯一 SpecQuality float32 `gorm:"index:unique_index_name_Id_quality"` - SpecUnit string `gorm:"type:varchar(8)"` + SpecUnit string `gorm:"type:varchar(8)"` // 质量或容量 + Weight int // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality - Weight int // 单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality - - JdID string `gorm:"type:varchar(48)"` + JdID int64 } type SkuNamePlaceBind struct { ModelIDCUO SkuNameID int `gorm:"unique_index:unique_sku_name_id_sku_place_id"` - PlaceID int `gorm:"unique_index:unique_sku_name_id_sku_place_id"` + PlaceCode int `gorm:"unique_index:unique_sku_name_id_sku_place_id"` } type StoreSkuBind struct { @@ -119,5 +119,6 @@ type StoreSkuBind struct { SubStoreID int Price int // 单位为分,不用int64的原因是这里不需要累加 Status int - ElmID string `gorm:"type:varchar(48)"` + + ElmID int64 } diff --git a/business/model/store.go b/business/model/store.go index e5f9c7352..51dc66c3e 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -11,19 +11,29 @@ const ( MainSubStoreAddress = "本店" ) +// 配送范围类型,此定义与京东到家相同,除非特殊说明,本系统中的坐标都是火星坐标 +const ( + DeliveryRangeTypePolygon = 2 + DeliveryRangeTypeRadius = 3 +) + type Store struct { ModelIDCUO - Name string `gorm:"type:varchar(255);unique_index"` - CityCode int - DistrictCode int - Address string `gorm:"type:varchar(255)"` - OpenTime1 int // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 - CloseTime1 int // 格式同上 - OpenTime2 int // 格式同上 - CloseTime2 int // 格式同上 - Lng int // 乘了10的6次方 - Lat int // 乘了10的6次方 - Status int + Name string `gorm:"type:varchar(255);unique_index"` + CityCode int // todo ? + DistrictCode int // todo ? + Address string `gorm:"type:varchar(255)"` + Tel1 string `gorm:"type:varchar(32)"` + Tel2 string `gorm:"type:varchar(32)"` + OpenTime1 int16 // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 + CloseTime1 int16 // 格式同上 + OpenTime2 int16 // 格式同上 + CloseTime2 int16 // 格式同上 + Lng int // 乘了10的6次方 + Lat int // 乘了10的6次方 + DeliveryRangeType int8 // 参见相关常量定义 + DeliveryRange string `gorm:"type:varchar(2048)"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 + Status int } type StoreSub struct { @@ -32,7 +42,7 @@ type StoreSub struct { Index int `gorm:"unique_index:unique_index1"` // 子店序号,为0表示主店 Name string `gorm:"type:varchar(255)"` Address string `gorm:"type:varchar(255)"` - Status int + Status int // 取值同Store.Status Mobile1 string `gorm:"type:varchar(32)"` Mobile2 string `gorm:"type:varchar(32)"` Mobile3 string `gorm:"type:varchar(32)"` @@ -43,7 +53,7 @@ type StoreMap struct { StoreID int `gorm:"unique_index:storemap1"` VendorID int `gorm:"unique_index:storemap1"` VendorStoreID string `gorm:"type:varchar(48);unique_index"` - Status int + Status int // 取值同Store.Status AutoPickup int8 // 是否自动拣货 DeliveryType int8 // 配送类型 diff --git a/business/partner/purchase/jd/jd.go b/business/partner/purchase/jd/jd.go index 011d6cf22..866ffeddf 100644 --- a/business/partner/purchase/jd/jd.go +++ b/business/partner/purchase/jd/jd.go @@ -28,13 +28,13 @@ func OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackR return curPurchaseHandler.OnWaybillMsg(msg) } -func JdOperationTime2JxOperationTime(value1 interface{}) int { - value := int(utils.Interface2Int64WithDefault(value1, 0)) +func JdOperationTime2JxOperationTime(value1 interface{}) int16 { + value := int16(utils.Interface2Int64WithDefault(value1, 0)) return (value/2)*100 + (value%2)*30 } -func JxOperationTime2JdOperationTime(value int) int { - return (value/100)*2 + (value % 30) +func JxOperationTime2JdOperationTime(value int16) int16 { + return (value/100)*2 + (value%100)/30 } func JdStoreStatus2JxStatus(yn, closeStatus interface{}) int { @@ -51,7 +51,7 @@ func JdStoreStatus2JxStatus(yn, closeStatus interface{}) int { func JxStoreStatus2JdStatus(status int) (yn, closeStatus int) { switch status { case model.StoreStatusDisabled: - return 1, 0 + return 1, 1 case model.StoreStatusClosed: return 0, 1 default: diff --git a/business/partner/purchase/jd/order_test.go b/business/partner/purchase/jd/order_test.go index b5e906203..1d3f0e11e 100644 --- a/business/partner/purchase/jd/order_test.go +++ b/business/partner/purchase/jd/order_test.go @@ -9,15 +9,17 @@ import ( "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/beegodb" + "git.rosy.net.cn/jx-callback/globals/gormdb" "github.com/astaxie/beego" ) 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() + gormdb.Init() api.Init() } diff --git a/business/partner/purchase/jd/product.go b/business/partner/purchase/jd/product.go new file mode 100644 index 000000000..69b432b00 --- /dev/null +++ b/business/partner/purchase/jd/product.go @@ -0,0 +1,206 @@ +package jd + +// 这里函数取得的信息,除了与自身实体相关的ID(比如PARENT ID),都已经转换成了本地ID了 + +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/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" + "git.rosy.net.cn/jx-callback/globals/gormdb" +) + +const ( + DefBrandID = 35247 + DefJdCategoryID = 20362 +) + +type skuInfoExt struct { + model.SkuName + Img string + JdID int64 // 商家类别 + JdCategoryID int // 到家类别 + SkuCatID int64 // 商家特殊类别 +} + +func (p *PurchaseHandler) CreateCategory(cat *model.SkuCategory, userName string) (err error) { + var jdPid int64 + if cat.ParentID != 0 { + pCat := &model.SkuCategory{} + pCat.ID = cat.ParentID + if err = dao.GetEntity(pCat, nil); err == nil { + jdPid = pCat.JdID + } else { + return err + } + } + result, err := api.JdAPI.AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName) + if err == nil { + cat.JdID = utils.Str2Int64(result) + } + return err +} + +func (p *PurchaseHandler) ReadCategory(vendorCatID string) (cat *model.SkuCategory, err error) { + result, err := p.ReadCategories() + if err == nil { + jdID := utils.Str2Int64(vendorCatID) + for _, v := range result { + if v.JdID == jdID { + return v, nil + } + } + } + return nil, err +} + +func (p *PurchaseHandler) ReadCategories() (cats []*model.SkuCategory, err error) { + result, err := api.JdAPI.QueryCategoriesByOrgCode() + if err == nil { + cats = make([]*model.SkuCategory, len(result)) + for k, v := range result { + cats[k] = &model.SkuCategory{ + ParentID: int(v.ParentId), // 这里是暂存,传递数据用,正确的值应该是本地的ID + Name: v.Name, + Level: int8(v.Level), + Seq: v.Sort, + JdID: v.Id, + } + } + return cats, nil + } + return nil, err +} + +func (p *PurchaseHandler) UpdateCategory(cat *model.SkuCategory) error { + return api.JdAPI.UpdateShopCategory(cat.JdID, cat.Name) +} + +func (p *PurchaseHandler) DeleteCategory(cat *model.SkuCategory) error { + return api.JdAPI.DelShopCategory(cat.JdID) +} + +func (p *PurchaseHandler) cuSku(sku *model.Sku, handler func(skuExt *skuInfoExt, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) { + var otherInfo skuInfoExt + db := gormdb.GetDB() + err = db.Raw(` + SELECT t2.*, t3.jd_id, t3.jd_category_id, t4.jd_id sku_cat_id + FROM sku t1 + JOIN sku_name t2 ON t1.name_id = t2.id + JOIN sku_category t3 ON t2.category_id = t3.id + LEFT JOIN sku_category t4 ON t1.category_id = t4.id + WHERE t1.id = ? + `, sku.ID).Scan(&otherInfo).Error + if err == nil { + shopCategories := []int64{otherInfo.JdID} + if otherInfo.SkuCatID != 0 { + shopCategories = append(shopCategories, otherInfo.SkuCatID) + } + if otherInfo.JdCategoryID == 0 { + otherInfo.JdCategoryID = DefJdCategoryID + } + if otherInfo.BrandID == 0 { + otherInfo.BrandID = DefBrandID + } + addParams := map[string]interface{}{} + + if otherInfo.IsGlobal == 0 { //如果不是全国可售,要查可售区域 + sellPlaces, err2 := dao.GetSellCities(otherInfo.ID, model.VendorIDJD, db) + if err = err2; err == nil && len(sellPlaces) > 0 { + sellCites := make([]int, len(sellPlaces)) + for k, v := range sellPlaces { + sellCites[k] = v.JdCode + } + addParams["sellCities"] = sellCites + } + } + if err == nil { + skuName := jxutils.ComposeSkuName(otherInfo.Prefix, otherInfo.Name, otherInfo.Comment, otherInfo.Unit, sku.SpecQuality, sku.SpecUnit, 0) + globals.SugarLogger.Debug(skuName) + result, err2 := handler(&otherInfo, skuName, shopCategories, addParams) + if err = err2; err == nil { + sku.JdID = utils.Str2Int64(result) + } + } + } + return err +} + +func (p *PurchaseHandler) CreateSku(sku *model.Sku) (err error) { + return p.cuSku(sku, func(skuExt *skuInfoExt, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error) { + return api.JdAPI.AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, skuExt.Price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, 1, true, addParams) + }) +} + +func (p *PurchaseHandler) ReadSku(vendorSkuID string) (skuName *model.SkuName, sellPlaces []*model.Place, sku *model.Sku, err error) { + result, _, err := api.JdAPI.QuerySkuInfos("", int(utils.Str2Int64(vendorSkuID)), 0, 0, false) + if err == nil { + if len(result) == 1 { + mapData := result[0] + skuNameStr := utils.Interface2String(mapData["skuName"]) + prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(skuNameStr) + if name == "" { + name = skuNameStr + unit = "份" + specUnit = "g" + } + skuName = &model.SkuName{ + Prefix: prefix, + Name: name, + Comment: comment, + Unit: unit, + Price: int(utils.MustInterface2Int64(mapData["skuPrice"])), + } + sku = &model.Sku{ + SpecQuality: specQuality, + SpecUnit: specUnit, + Weight: jxutils.FloatWeight2Int(float32(utils.MustInterface2Float64(mapData["weight"]))), + JdID: utils.MustInterface2Int64(mapData["skuId"]), + } + sku.ID = int(utils.Str2Int64(utils.Interface2String(mapData["outSkuId"]))) + + db := gormdb.GetDB() + shopCategories := utils.Interface2Int64List(mapData["shopCategories"]) + if len(shopCategories) > 0 { + skuCat := &model.SkuCategory{} + if db.Where("jd_id = ?", shopCategories[0]).Find(skuCat).Error == nil { + skuName.CategoryID = skuCat.ID + } + } + sellCities := utils.Interface2Int64List(mapData["sellCities"]) + if len(sellCities) == 0 { + skuName.IsGlobal = 1 + } else { + sellPlaces = make([]*model.Place, 0) + err2 := db.Where("jd_code IN (?) AND level = 2", sellCities).Find(&sellPlaces).Error + globals.SugarLogger.Debug("err2:%v", err2) + } + return skuName, sellPlaces, sku, nil + } + } + return nil, nil, nil, err +} + +func (p *PurchaseHandler) UpdateSku(sku *model.Sku) (err error) { + return p.cuSku(sku, func(skuExt *skuInfoExt, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error) { + params := utils.MergeMaps(addParams) + params["categoryId"] = skuExt.JdCategoryID + params["shopCategories"] = shopCategories + params["brandId"] = skuExt.BrandID + params["skuName"] = skuName + params["weight"] = jxutils.IntWeight2Float(sku.Weight) + params["images"] = []string{skuExt.Img} + + return api.JdAPI.UpdateSku(utils.Int2Str(sku.ID), params) + }) +} + +func (p *PurchaseHandler) DeleteSku(sku *model.Sku) (err error) { + params := map[string]interface{}{ + "fixedStatus": 4, + } + _, err = api.JdAPI.UpdateSku(utils.Int2Str(sku.ID), params) + return err +} diff --git a/business/partner/purchase/jd/product_test.go b/business/partner/purchase/jd/product_test.go new file mode 100644 index 000000000..43bd96c38 --- /dev/null +++ b/business/partner/purchase/jd/product_test.go @@ -0,0 +1,56 @@ +package jd + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" +) + +func TestCreateSku(t *testing.T) { + // t.Log(beego.BConfig.RunMode) + skuID := 21741 + sku := &model.Sku{} + sku.ID = skuID + dao.GetEntity(sku, nil) + t.Log(sku) + // err := new(PurchaseHandler).CreateSku(sku) + // if err != nil { + // t.Fatal(err.Error()) + // } +} + +func TestUpdateSku(t *testing.T) { + // t.Log(beego.BConfig.RunMode) + skuID := 21741 + sku := &model.Sku{} + sku.ID = skuID + dao.GetEntity(sku, nil) + + err := new(PurchaseHandler).UpdateSku(sku) + if err != nil { + t.Fatal(err.Error()) + } +} + +func TestReadCategories(t *testing.T) { + result, err := new(PurchaseHandler).ReadCategories() + if err != nil || len(result) == 0 { + t.Fatal(err.Error()) + } + t.Log(result[0]) +} + +func TestReadSku(t *testing.T) { + skuName, sellCites, sku, err := new(PurchaseHandler).ReadSku("2018544585") + if err != nil { + t.Fatal(err.Error()) + } + if skuName.Name != "每日鲜*脊骨" || sellCites[0].Name != "武汉市" || sku.SpecUnit != "g" { + t.Fatal("ReadSku return data wrong") + t.Log(string(utils.MustMarshal(skuName))) + t.Log(string(utils.MustMarshal(sellCites))) + t.Log(string(utils.MustMarshal(sku))) + } +} diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index 6062fe052..2cbb2329e 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -1,6 +1,11 @@ package jd import ( + "fmt" + "strings" + + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals/api" @@ -18,8 +23,18 @@ func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) CloseTime2: JdOperationTime2JxOperationTime(result["serviceTimeEnd2"]), Status: JdStoreStatus2JxStatus(result["yn"], result["closeStatus"]), } + retVal.ID = int(utils.Str2Int64WithDefault(utils.Interface2String(result["outSystemId"]), 0)) - return retVal, nil + result, err2 := api.JdAPI.GetDeliveryRangeByStationNo(vendorStoreID) + if err = err2; err == nil { + retVal.DeliveryRangeType = int8(utils.MustInterface2Int64(result["deliveryRangeType"])) + if retVal.DeliveryRangeType == model.DeliveryRangeTypePolygon { + retVal.DeliveryRange = JdRange2JxRange(utils.Interface2String(result["deliveryRange"])) + } else { + retVal.DeliveryRange = utils.Int64ToStr(utils.MustInterface2Int64(result["deliveryRangeRadius"])) + } + return retVal, nil + } } return nil, err } @@ -31,8 +46,19 @@ func (p *PurchaseHandler) UpdateStore(vendorStoreID string, store *model.Store, "stationAddress": store.Address, "serviceTimeStart1": JxOperationTime2JdOperationTime(store.OpenTime1), "serviceTimeEnd1": JxOperationTime2JdOperationTime(store.CloseTime1), - "serviceTimeStart2": JxOperationTime2JdOperationTime(store.OpenTime2), - "serviceTimeEnd2": JxOperationTime2JdOperationTime(store.CloseTime2), + "deliveryRangeType": store.DeliveryRangeType, + "coordinateType": 3, // 一直用高德 + } + if store.DeliveryRangeType == model.DeliveryRangeTypePolygon { + params["coordinatePoints"] = JxRange2JdRange(store.DeliveryRange) + } else { + params["deliveryRangeRadius"] = utils.Str2Int64(store.DeliveryRange) + } + + openTime2 := JxOperationTime2JdOperationTime(store.OpenTime2) + if openTime2 != 0 { + params["serviceTimeStart2"] = openTime2 + params["serviceTimeEnd2"] = JxOperationTime2JdOperationTime(store.CloseTime2) } _, params["closeStatus"] = JxStoreStatus2JdStatus(store.Status) // globals.SugarLogger.Debug(utils.Format4Output(params, false)) @@ -44,8 +70,7 @@ func (p *PurchaseHandler) UpdateStore(vendorStoreID string, store *model.Store, // params := map[string]interface{}{ // "yn": 1, // } -// _, err := api.JdAPI.UpdateStoreInfo4Open(vendorStoreID, userName, params) -// return err +// return api.JdAPI.UpdateStoreInfo4Open(vendorStoreID, userName, params) // } func (p *PurchaseHandler) EnableAutoAcceptOrder(vendorStoreID string, isEnabled bool) error { @@ -91,3 +116,31 @@ func (p *PurchaseHandler) GetAllStoresFromRemote() ([]*model.Store, error) { } return nil, err } + +func JdRange2JxRange(jdRanges string) (jxRanges string) { + coords := strings.Split(jdRanges, ";") + intCoords := []string{} + for _, coord := range coords { + items := strings.Split(coord, ",") + if len(items) == 2 { + lng := jxutils.StandardCoordinate2Int(utils.Str2Float64(items[0])) + lat := jxutils.StandardCoordinate2Int(utils.Str2Float64(items[1])) + intCoords = append(intCoords, fmt.Sprintf("%d,%d", lng, lat)) + } + } + return strings.Join(intCoords, ";") +} + +func JxRange2JdRange(jxRanges string) (jdRanges string) { + coords := strings.Split(jxRanges, ";") + intCoords := []string{} + for _, coord := range coords { + items := strings.Split(coord, ",") + if len(items) == 2 { + lng := jxutils.IntCoordinate2Standard(int(utils.Str2Int64(items[0]))) + lat := jxutils.IntCoordinate2Standard(int(utils.Str2Int64(items[1]))) + intCoords = append(intCoords, fmt.Sprintf("%f,%f", lng, lat)) + } + } + return strings.Join(intCoords, ";") +} diff --git a/business/partner/purchase/jd/store_test.go b/business/partner/purchase/jd/store_test.go new file mode 100644 index 000000000..f5ef53367 --- /dev/null +++ b/business/partner/purchase/jd/store_test.go @@ -0,0 +1,77 @@ +package jd + +import ( + "strings" + "testing" +) + +const ( + TestStoreNo = "11736989" +) + +func TestReadStore(t *testing.T) { + result, err := new(PurchaseHandler).ReadStore(TestStoreNo) + if err != nil { + t.Fatal(err.Error()) + } + t.Log(result) +} + +func TestCloseStore(t *testing.T) { + err := new(PurchaseHandler).CloseStore(TestStoreNo, "我就是想休息一下", "test") + if err != nil { + t.Fatal(err.Error()) + } +} + +func TestOpenStore(t *testing.T) { + err := new(PurchaseHandler).OpenStore(TestStoreNo, "test") + if err != nil { + t.Fatal(err.Error()) + } +} + +func TestUpdateStore(t *testing.T) { + handler := new(PurchaseHandler) + result, err := handler.ReadStore(TestStoreNo) + + // result := &model.Store{} + // result.ID = 100164 + // err := dao.GetEntity(result, nil) + + if err != nil { + t.Fatal(err.Error()) + } + result.Name += "h" + newName := result.Name + err = handler.UpdateStore(TestStoreNo, result, "ttt") + if err != nil { + t.Fatal(err.Error()) + } + + // same + result, err = handler.ReadStore(TestStoreNo) + if result.Name != newName { + t.Fatalf("result is not same, desired newName:%s, newName:%s", newName, result.Name) + } + + // restore + result.Name = strings.Trim(result.Name, "h") + err = handler.UpdateStore(TestStoreNo, result, "ttt") + if err != nil { + t.Fatal(err.Error()) + } +} + +func TestCoordRangeConversion(t *testing.T) { + jxRange := "108841759,34332892;108842271,34330820;108846013,34331422;108846110,34333189;108847722,34331853;108856703,34331729;108866149,34327507;108873423,34320980;108877737,34312856;108877727,34299624;108870105,34287988;108855137,34290911;108867884,34286298;108858260,34281316;108854162,34283490;108853803,34280145;108846110,34279291;108830587,34282539;108818806,34291500;108814493,34299624;108813596,34308465;108818797,34320980;108830582,34329941;108841759,34332892" + jdRange := "108.841759,34.332892;108.842271,34.330820;108.846013,34.331422;108.846110,34.333189;108.847722,34.331853;108.856703,34.331729;108.866149,34.327507;108.873423,34.320980;108.877737,34.312856;108.877727,34.299624;108.870105,34.287988;108.855137,34.290911;108.867884,34.286298;108.858260,34.281316;108.854162,34.283490;108.853803,34.280145;108.846110,34.279291;108.830587,34.282539;108.818806,34.291500;108.814493,34.299624;108.813596,34.308465;108.818797,34.320980;108.830582,34.329941;108.841759,34.332892" + + if JdRange2JxRange(jdRange) != jxRange { + t.Fatal("result doesn't match") + } + + if JxRange2JdRange(jxRange) != jdRange { + t.Fatal("result doesn't match") + } +}