Commit 6a2d2c3c by huangchengyi

Merge branch 'master' of http://119.23.72.7/mushishixian/search_server into dev

# Conflicts:
#	service/ly/sourceability.go
parents 7f202186 d9bd172e
package controller
import (
"github.com/gin-gonic/gin"
"search_server/pkg/common"
"search_server/service"
)
/*
*获取比价详情
@param number 比价数量,eg:500
@param deliver 交货地: 1 大陆 2 香港 (默认大陆)
@param alike_spu_id 替代型号spu_id,多个spu_id 以逗号分隔,如:2160551099924392802,2160551101943552102
*/
func GetParityData(ctx *gin.Context) {
common.PrintDebugHeader(ctx) //debug
optimumservice := service.ParityService{}
apiData := optimumservice.GetParity(ctx)
common.PrintDebugHtml(ctx,"-----执行结束----") //debug
common.Output(ctx,apiData.ErrorCode, "查询成功", apiData.Data)
}
......@@ -4,6 +4,7 @@ import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"github.com/syyongx/php2go"
"strings"
)
......@@ -17,6 +18,13 @@ func Sha1(query string, pri_key string) string {
}
func main() {
myNum := []int{10, 20, 30, 40, 50}
// 创建一个新切片
// 其长度为 2 个元素,容量为 4 个元素
newNum := myNum[1:4]
fmt.Println(newNum)
return
dd := php2go.InArray("1003",[]string{"1001","1002"})
print(dd)
return
......
package main
import "fmt"
func main() {
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(len(s))
s = s[3:9]
fmt.Println(s)
fmt.Println(len(s))
fmt.Println(cap(s))
}
\ No newline at end of file
......@@ -84,6 +84,7 @@ type ZiyinGoodsInfo struct {
type DullGoodsData struct {
ApiGoods
//额外增加的字段
Tprice float64 `json:"tprice,omitempty"` //用于比价梯度判断
GoodsNameTemp string `json:"goods_name_temp,omitempty"`
Multiple int `json:"-"`
MultipleStr interface{} `json:"multiple,omitempty"`
......
......@@ -10,6 +10,7 @@ import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gogf/gf/util/gconv"
"github.com/syyongx/php2go"
"github.com/tidwall/gjson"
"math"
......@@ -191,7 +192,7 @@ func NumberToHtml(number int) (html string) {
numberToClassSlice := vars.NumberToClass
if number != 0 {
//数字转字符串
numberStr := ToString(number)
numberStr := gconv.String(number)
for i := 0; i < len(numberStr); i++ {
var classHtml string
numStr := php2go.Substr(numberStr, uint(i), 1)
......@@ -203,7 +204,6 @@ func NumberToHtml(number int) (html string) {
classHtml = `<font class="` + class + otherClass + `"></font>`
}
html = html + classHtml
return
}
}
return
......@@ -214,7 +214,7 @@ func NumberToHtml(number int) (html string) {
* 返回形式如下 : yuiopkdsi rnvewjeil xmiqplmza
*/
func StrRandom(lenNum int) string {
randStr := "sdwpkxmiqplmzacbmeruwulurjlauejrifkfghjklzxcvbnmqwwertyuiopkdsieurnvewjeilweiskvnx"
randStr := "asdwpkxmiqplmzacbmeruwulurjlauejrifkfghjklzxcvbnmqwwertyuiopkdsieurnvewjeilweiskvnx"
strLen := len(randStr) - 9
var result string
for i := 0; i < lenNum; i++ {
......
......@@ -60,6 +60,7 @@ func getConn(writeHost, password string) (pool *redis.Pool, err error) {
_, err := c.Do("PING")
return err
},
Wait: true,
}
return
}
\ No newline at end of file
......@@ -2,8 +2,8 @@ package vars
//数字转class字符串,按顺序0-9
var NumberToClass = [][]string{
{"sfgdqwer", "asfgdtyhg", "asfgdpolk", "asfgdpoqw"},
{"sfgdrfdf","asfgderfd","asfgdwdsa","asfgdpoer"},
{"asfgdqwer","asfgdtyhg","asfgdpolk","asfgdpoqw"},
{"asfgdrfdf","asfgderfd","asfgdwdsa","asfgdpoer"},
{"asfgdasde","asfgdqwsz","asfgdrtgd","asfgdpovv"},
{"asfgdwsxc","asfgdwsxz","asfgdrfvb","asfgdpoee"},
{"asfgdqazs","asfgdqasd","asfgdqwag","asfgdpogh"},
......
......@@ -39,6 +39,8 @@ func InitRouter() *gin.Engine {
//搜索相关接口
v4 := r.Group("/search/")
{
v4.POST("parity/info", controller.GetParityData)
v4.GET("parity/info", controller.GetParityData)
v4.POST("mouser/a", controller.GetMouserData)
v4.GET("mouser/a", controller.GetMouserData)
v4.POST("digikey/a", controller.GetDigikeyData)
......
......@@ -5,7 +5,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/iancoleman/orderedmap"
"github.com/imroc/req"
"github.com/syyongx/php2go"
"github.com/tidwall/gjson"
"search_server/model"
"search_server/pkg/common"
......@@ -98,6 +97,7 @@ func OutLinkSource(ctx *gin.Context,goodsName *string) *orderedmap.OrderedMap {
wg.Add(1)
ch <- true
go func() {
//fmt.Println(php2go.Time())
B := orderedmap.New()
B.Set("goods_sn",goods_sn)
B.Set("goods_name",goods_name)
......@@ -124,7 +124,7 @@ func GetSourceInfo(ctx *gin.Context,B *orderedmap.OrderedMap,wg *sync.WaitGroup)
goods_sn,_ := B.Get("goods_sn")
skuInfo := GetSourceGineData(ctx,fmt.Sprintf(SourceSkuPriceUrl,goods_sn))
fmt.Println("请求价格开始:",php2go.Time(),fmt.Sprintf(SourceSkuPriceUrl,goods_sn))
//fmt.Println("请求价格开始:",php2go.Time(),fmt.Sprintf(SourceSkuPriceUrl,goods_sn))
//$skuPriceRes = `{"total":3,"results":[{"offerPlatformId":"8718009643","mpq":1,"quantity":2277626,"priceTiers":[{"moq":807,"price":"0.06820"}],"deliveryDays":5,"vendor":{"type":"factory_direct"},"dateCode":null,"isDateCodeWithin2Years":true,"availabilityType":"stock","packagingType":"tube","packagingCondition":"full"},{"offerPlatformId":"8715417520","mpq":1,"quantity":1520,"priceTiers":[{"moq":709,"price":"0.07768"}],"deliveryDays":7,"vendor":{"type":"authorised_distributor"},"dateCode":null,"isDateCodeWithin2Years":true,"availabilityType":"stock","packagingType":"tape_reel","packagingCondition":"full"},{"offerPlatformId":"8715417522","mpq":1,"quantity":283206,"priceTiers":[{"moq":709,"price":"0.07768"}],"deliveryDays":167,"vendor":{"type":"authorised_distributor"},"dateCode":null,"isDateCodeWithin2Years":true,"availabilityType":"lead_time","packagingType":"tape_reel","packagingCondition":"full"}],"facets":{"vendorTypes":[{"value":"authorised_distributor","label":"authorised_distributor","count":2},{"value":"factory_direct","label":"factory_direct","count":1}],"availabilityTypes":[{"value":"lead_time","label":"lead_time","count":1},{"value":"stock","label":"stock","count":2}],"packagingConditions":[{"value":"full","label":"full","count":3}],"packagingTypes":[{"value":"tape_reel","label":"tape_reel","count":2},{"value":"tube","label":"tube","count":1}]},"_links":{"schema":{"href":"/api/schemas/part-offer-search.json"}}}`;
priceGoodsList := gjson.Get(skuInfo,"results").Array()
common.PrintDebugHtml(ctx,priceGoodsList)
......
......@@ -168,6 +168,8 @@ func (qs *OptimumService) GetOptimumAttr(ctx *gin.Context) (results model.LyResp
返回供应商详情
*/
func (qs *OptimumService) GetOptimumAttrInfo(ctx *gin.Context) (results model.LyResponse) {
//fmt.Print(common.NumberToHtml(gconv.Int(ctx.Request.FormValue("d"))))
//索引字典
qs.getQueryAttr(ctx)
//获取查询条件
......@@ -241,12 +243,27 @@ func (qs *OptimumService) GetOptimumAttrInfo(ctx *gin.Context) (results model.Ly
}
}
}
Multiple := 0 //联营倍数
if v.SupplierName != "猎芯自营" {
//联营倍数
Multiple = v.Mpq
if v.Mpq > v.Moq {
Multiple = v.Moq
}
}
v.StockStr = common.NumberToHtml(v.Stock)
v.MoqStr = common.NumberToHtml(v.Moq)
v.MpqStr = common.NumberToHtml(v.Mpq)
v.MplStr = common.NumberToHtml(v.Mpl)
MultipleStr := common.NumberToHtml(Multiple)
endArr = append(endArr,model.DullGoodsData{
ApiGoods:v,
GoodsUrl: GoodsUrl,
BrandUrl: BrandUrl,
Attrs: attrs[v.GoodsId],
MultipleStr:MultipleStr,
})
}
......
package service
import (
"github.com/gin-gonic/gin"
"github.com/gogf/gf/util/gconv"
"github.com/iancoleman/orderedmap"
"github.com/tidwall/gjson"
"search_server/model"
"search_server/pkg/common"
"search_server/pkg/config"
"search_server/pkg/es"
"search_server/service/query"
"sort"
"strconv"
"strings"
)
type ParityService struct {
}
/*
* 查询比价
@param number 比价数量,eg:500
@param deliver 交货地: 1 大陆 2 香港 (默认大陆)
@param target_goods_name/eq 目标比价型号名称精确搜索,多个型号名称(类似型号一样这样拼接传) 以€分隔,如:LM358DT€LM358SK
@param target_goods_name/like 目标比价型号名称模糊搜索,多个型号名称(类似型号一样这样拼接传) 以€分隔,如:LM358DT€LM358SK
*/
func (qs *ParityService) GetParity(ctx *gin.Context) (results model.LyResponse) {
number := ctx.Request.FormValue("number") //比价数量
deliver := ctx.Request.FormValue("deliver") //交货地
target_goods_name := ctx.Request.FormValue("target_goods_name/eq") //比价目标型号
target_goods_type := 1 //精确匹配
if target_goods_name == "" {
target_goods_name = ctx.Request.FormValue("target_goods_name/like") //比价目标型号
target_goods_type = 2 //模糊匹配
}
if target_goods_name == "" {
results.ErrorCode = 1001;
results.ErrorMsg = "目标比价型号不得为空"
return
}
//获取查询条件
queryString := query.GetParityQuery(ctx,target_goods_name,target_goods_type)
indexTarget := "liexin_ziying"
if deliver == "2" {
indexTarget = config.Get("es.search_supplier").String();
}
//查询es
esResult, err := es.CurlEsPrimary(indexTarget, queryString)
if err != nil {
results.ErrorCode = 1002;
results.ErrorMsg = err.Error()
return
}
common.PrintDebugHtml(ctx,esResult)
//判断返回总条数
total := gjson.Get(esResult, "hits.total").Int()
if total == 0 {
results.ErrorCode = 0;
results.ErrorMsg = "查询没有数据"
return
}
goodsIds := make([]string,0) //goods_id
attrs := make(map[string][]map[string]string) //属性
gjArray := gjson.Get(esResult, "hits.hits.#._source").Array()
for _, item := range gjArray {
goods_id := item.Get("goods_id").String()
goodsIds = append(goodsIds, goods_id)
}
common.PrintDebugHtml(ctx,goodsIds)
//拼接返回数据
A := orderedmap.New() //初始化有序map,拼接data 数据
//组装商品详情
//endArr := make([]model.DullGoodsData,0)
var slic []model.DullGoodsData
goodsList, _ := GetGoodsInfo(ctx,goodsIds)
for _,v := range goodsList{
GoodsUrl := ""
BrandUrl := ""
referer := ctx.GetHeader("Referer")
if referer != ""{
dome := strings.Split(referer,".com")
if len(dome) > 0{
if v.SupplierName == "猎芯自营" {
GoodsUrl = dome[0]+".com/item/"+v.GoodsId+".html"
BrandUrl = dome[0]+".com/v3/brand/list/"+strconv.Itoa(v.BrandId)+".html"
}else{
GoodsUrl = dome[0]+".com/goods_"+v.GoodsId+".html"
BrandUrl = dome[0]+".com/v3/brand/list/"+strconv.Itoa(v.BrandId)+".html"
}
}
}
if len(v.LadderPrice) == 0 { //梯度价
continue;
}
//比价数量对应的梯度数量
var tprice float64 = 0; //对应梯度价
for _,p := range v.LadderPrice {
if p.Purchases >= gconv.Int(number) {
if deliver == "1" { //大陆
tprice = p.PriceCn
}else{ //香港
tprice = p.PriceUs
}
break;
}
}
slic = append(slic,model.DullGoodsData{
ApiGoods:v,
GoodsUrl: GoodsUrl,
BrandUrl: BrandUrl,
Attrs: attrs[v.GoodsId],
Tprice: tprice, //对应梯度价格
})
}
sort.Sort(DullGoodsData(slic))
allCount := len(slic) //总条数
//分页计算
page := ctx.Request.FormValue("page")
page_size := ctx.Request.FormValue("page_size")
page_from := 0
if page == "" {
page = "1";
}
if page_size == "" {
page_size = "10";
}
if page != "1" && page != "" {
page_from = (gconv.Int(page)-1)*gconv.Int(page_size)
if page_from >10000 {
page_from = 10000;
}
}
offset := page_from+gconv.Int(page_size)
if offset > allCount || page_from > allCount {
page_from = allCount
offset = allCount
}
slicNew := slic[page_from:offset]
pageData := PageClear(ctx,gconv.Int64(allCount));
pageData["took"] = gjson.Get(esResult, "took").Int()
A.Set("page",pageData) //分页信息
A.Set("goods_lists",slicNew)
results.ErrorCode = 0;
results.ErrorMsg = "查询成功";
results.Data = A;
return
}
//阶梯价格排序算法
type DullGoodsData []model.DullGoodsData
func (a DullGoodsData) Len() int {
return len(a)
}
func (a DullGoodsData) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func (a DullGoodsData) Less(i, j int) bool {
return a[j].Tprice > a[i].Tprice
}
\ No newline at end of file
package query
import (
"errors"
"github.com/gin-gonic/gin"
"gopkg.in/olivere/elastic.v5"
"search_server/pkg/common"
......@@ -30,12 +31,17 @@ func GetOptimumAttrQuery(ctx *gin.Context,REQUEST_ATTR *map[string][]string,type
if class_id2 != "" {
query.Must(elastic.NewTermQuery("class_id2",class_id2))
}
if class_id1 == "" && class_id2 == "" {
return "",errors.New("分类参数不得为空")
}
if ctx.Request.FormValue("avail_rank") == "1" { //只显示有货
query.Must(elastic.NewRangeQuery("stock").Gt(0))
}
goods_name := common.DrawLetterNum(ctx.Request.FormValue("goods_name/condition"))
if goods_name != "" { //型号搜索
query.Must(elastic.NewTermQuery("goods_name",goods_name))
query.Must(elastic.NewMatchQuery("goods_name",goods_name).MinimumShouldMatch("30%")) //模糊匹配
}
//存在属性查询
......
package query
import (
"github.com/gin-gonic/gin"
"github.com/syyongx/php2go"
"gopkg.in/olivere/elastic.v5"
"search_server/pkg/common"
)
/*
比价拼接查询语句
@param target_goods_name 目标比价型号名称,多个型号名称(类似型号一样这样拼接传) 以€分隔,如:LM358DT€LM358SK
*/
func GetParityQuery(ctx *gin.Context,target_goods_name string,target_goods_type int) (param string){
query := elastic.NewBoolQuery()
subQuery := elastic.NewBoolQuery()
if target_goods_name == "" {
return ""
}
goodsSlice:= php2go.Explode("€",target_goods_name);
for _,goods_name := range goodsSlice {
if target_goods_type == 1 { //精确匹配
subQuery.Should(elastic.NewTermQuery("auto_goods_name.raw", goods_name))
}else{
subQuery.Should(elastic.NewTermQuery("goods_name", goods_name)) //DEBUG
}
}
query.Must(elastic.NewTermQuery("goods_status", 1))
query.Must(elastic.NewTermQuery("status", 1))
query.Must(elastic.NewRangeQuery("stock").Gt(0))
query.Must(subQuery)
source := elastic.NewSearchSource()
source.FetchSourceContext(elastic.NewFetchSourceContext(true).Include("goods_id","goods_name")) //显示字段
source.Size(200)
source.From(0)
source.Query(query)
searchRequest := elastic.NewSearchRequest().Source(source)
param, _ = searchRequest.Body()
common.PrintDebugHtml(ctx,param)
return
}
/*
上面查询最终拼接以下es查询:
{
"query": {
"bool": {
"must": [
{
"term": {
"goods_status": {
"value": "1"
}
}
},
{
"term": {
"status": {
"value": "1"
}
}
},
{
"range": {
"stock": {
"gt": 0
}
}
},
{
"bool": {
"should": [
{
"term": {
"auto_goods_name.raw": {
"value": "LM358DT"
}
}
},
{
"term": {
"auto_goods_name.raw": {
"value": "LM358DS"
}
}
}
]
}
}
]
}
}
}
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment