- jd basic api(category, sku, store management) finished.

This commit is contained in:
gazebo
2018-08-30 15:22:26 +08:00
parent 7774fd0995
commit 29d358af5e
12 changed files with 485 additions and 86 deletions

View File

@@ -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
}

48
business/model/dao/dao.go Normal file
View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 // 配送类型

View File

@@ -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:

View File

@@ -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()
}

View File

@@ -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
}

View File

@@ -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)))
}
}

View File

@@ -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, ";")
}

View File

@@ -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")
}
}