diff --git a/business/model/dao/page_store.go b/business/model/dao/page_store.go index e63108c8c..676f6d68b 100644 --- a/business/model/dao/page_store.go +++ b/business/model/dao/page_store.go @@ -9,9 +9,12 @@ type PageShopWithPlaceName struct { CityName string `json:"cityName"` DistrictName string `json:"districtName"` + Distance int `json:"distance"` } -func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStoreID string, vendorID int, orgCode string, cityCode, districtCode int, tel string, minShopScore float32, minRecentOrderNum, minSkuCount int) (pagedInfo *model.PagedInfo, err error) { +func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStoreID string, vendorID int, orgCode string, + cityCode, districtCode int, tel string, minShopScore float32, minRecentOrderNum, minSkuCount int, + lng1, lat1, lng2, lat2 float64) (pagedInfo *model.PagedInfo, err error) { sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, @@ -59,6 +62,10 @@ func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStor sql += " AND t1.sku_count >= ?" sqlParams = append(sqlParams, minSkuCount) } + if lng1 > 0 { + sql += " AND t1.lng >= ? AND t1.lat >= ? AND t1.lng <= ? AND t1.lat <= ?" + sqlParams = append(sqlParams, lng1, lat1, lng2, lat2) + } if keyword != "" { keywordLike := "%" + keyword + "%" sql += " AND (t1.name LIKE ? OR t1.tel1 LIKE ? OR t1.tel2 LIKE ? OR t1.org_code LIKE ? OR t1.address LIKE ? OR t2.name LIKE ? OR t3.name LIKE ? OR t1.licence_code LIKE ?" @@ -70,9 +77,7 @@ func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStor LIMIT ? OFFSET ? ` pageSize = FormalizePageSize(pageSize) - if offset < 0 { - offset = 0 - } + offset = FormalizePageOffset(offset) sqlParams = append(sqlParams, pageSize, offset) var shopList []*PageShopWithPlaceName Begin(db) diff --git a/controllers/net_spider.go b/controllers/net_spider.go index 34b85c128..79973144e 100644 --- a/controllers/net_spider.go +++ b/controllers/net_spider.go @@ -1,7 +1,12 @@ package controllers import ( + "fmt" + "sort" + + "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/business/netspider" "github.com/astaxie/beego" @@ -49,6 +54,9 @@ func (c *NetSpiderController) GetAndStoreCitiesShops() { // @Param minShopScore query float64 false "门店分值最小值" // @Param minRecentOrderNum query int false "最近单量最小值" // @Param minSkuCount query int false "SKU数量最小值" +// @Param radius query int false "关注点半径(米)" +// @Param lng query string false "关注点经度" +// @Param lat query string false "关注点纬度" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /QueryPageStores [get] @@ -57,7 +65,64 @@ func (c *NetSpiderController) QueryPageStores() { if params.MapData["vendorID"] == nil { params.VendorID = -1 } - retVal, err = dao.QueryPageStores(dao.GetDB(), params.PageSize, params.Offset, params.Keyword, params.VendorStoreID, params.VendorID, params.OrgCode, params.CityCode, params.DistrictCode, params.Tel, float32(params.MinShopScore), params.MinRecentOrderNum, params.MinSkuCount) + var lng, lat, lng1, lat1, lng2, lat2 float64 + params.Offset = dao.FormalizePageOffset(params.Offset) + params.PageSize = dao.FormalizePageSize(params.PageSize) + offset := params.Offset + pageSize := params.PageSize + if params.Radius > 0 { + lng = utils.Str2Float64WithDefault(params.Lng, 0) + lat = utils.Str2Float64WithDefault(params.Lat, 0) + if lng == 0 || lat == 0 { + return nil, "", fmt.Errorf("坐标信息%s,%s不合法", params.Lng, params.Lat) + } + lng2, _ = jxutils.ConvertDistanceToLogLat(lng, lat, float64(params.Radius), 90) + _, lat2 = jxutils.ConvertDistanceToLogLat(lng, lat, float64(params.Radius), 0) + lng1 = lng - (lng2 - lng) + lat1 = lat - (lat2 - lat) + offset = 0 + pageSize = model.UnlimitedPageSize + } + pagedInfo, err := dao.QueryPageStores(dao.GetDB(), pageSize, offset, params.Keyword, params.VendorStoreID, params.VendorID, params.OrgCode, + params.CityCode, params.DistrictCode, params.Tel, float32(params.MinShopScore), params.MinRecentOrderNum, params.MinSkuCount, + lng1, lat1, lng2, lat2) + if err == nil { + if params.Radius > 0 && (params.Offset != 0 || params.PageSize != model.UnlimitedPageSize) { + shopList, _ := pagedInfo.Data.([]*dao.PageShopWithPlaceName) + pagedInfo.TotalCount = len(shopList) + if len(shopList) > 0 { + for _, v := range shopList { + v.Distance = int(jxutils.EarthDistance(v.Lng, v.Lat, lng, lat) * 1000) + } + sort.Sort(PageShopList(shopList)) + if params.Offset < len(shopList) { + index := params.Offset + params.PageSize + if index > len(shopList) { + index = len(shopList) + } + shopList = shopList[params.Offset:index] + } else { + shopList = nil + } + } + pagedInfo.Data = shopList + } + retVal = pagedInfo + } return retVal, "", err }) } + +type PageShopList []*dao.PageShopWithPlaceName + +func (l PageShopList) Len() int { + return len(l) +} + +func (l PageShopList) Less(i, j int) bool { + return l[i].Distance < l[j].Distance +} + +func (l PageShopList) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +}