Files
jx-callback/controllers/net_spider.go
gazebo d836376ac3 fk
2019-11-27 18:02:47 +08:00

139 lines
5.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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"
)
type NetSpiderController struct {
beego.Controller
}
// @Title 从网页拉取平台门店信息
// @Description 从网页拉取平台门店信息
// @Param token header string true "认证token"
// @Param vendorIDs formData string false "厂商ID列表"
// @Param cityCodes formData string false "城市列表,缺省为后台启用了的城市"
// @Param radius formData int false "区域半径市或街道的半径会自动增加或缩小单位为米缺省8000米"
// @Param gridWith formData int false "网格大小单位为米缺省为2000米"
// @Param isShuffle formData bool false "是否将城市列表随机打乱"
// @Param isAsync formData bool false "是否异步"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetAndStoreCitiesShops [post]
func (c *NetSpiderController) GetAndStoreCitiesShops() {
c.callGetAndStoreCitiesShops(func(params *tNetspiderGetAndStoreCitiesShopsParams) (retVal interface{}, errCode string, err error) {
var vendorIDs, cityCodes []int
err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDs, params.CityCodes, &cityCodes)
if err == nil {
retVal, err = netspider.GetAndStoreCitiesShops(params.Ctx, vendorIDs, cityCodes, params.Radius, params.GridWith, params.IsShuffle, params.IsAsync)
}
return retVal, "", err
})
}
// @Title 同步商家商品信息
// @Description 同步商家商品信息
// @Param token header string true "认证token"
// @Param offset query int false "列表起始序号以0开始缺省为0"
// @Param pageSize query int false "列表页大小缺省为50-1表示全部"
// @Param keyword query string false "查询关键字(可以为空,为空表示不限制)"
// @Param vendorStoreID query string false "门店号"
// @Param vendorID query int false "平台ID"
// @Param orgCode query string false "连锁品牌名"
// @Param cityCode query int false "城市代码"
// @Param districtCode query int false "行政区代码"
// @Param tel query string false "手机号"
// @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]
func (c *NetSpiderController) QueryPageStores() {
c.callQueryPageStores(func(params *tNetspiderQueryPageStoresParams) (retVal interface{}, errCode string, err error) {
if params.MapData["vendorID"] == nil {
params.VendorID = -1
}
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) {
shopList2, _ := pagedInfo.Data.([]*dao.PageShopWithPlaceName)
var shopList []*dao.PageShopWithPlaceName
pagedInfo.TotalCount = 0
if len(shopList2) > 0 {
for _, v := range shopList2 {
v.Distance = int(jxutils.EarthDistance(v.Lng, v.Lat, lng, lat) * 1000)
if v.Distance < 0 {
v.Distance = 0
}
if v.Distance <= params.Radius {
shopList = append(shopList, v)
}
}
pagedInfo.TotalCount = len(shopList)
if pagedInfo.TotalCount > 0 {
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]
}