139 lines
5.3 KiB
Go
139 lines
5.3 KiB
Go
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 = jxutils.FormalizePageOffset(params.Offset)
|
||
params.PageSize = jxutils.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]
|
||
}
|