Commit e7fc6f26 by huangchengyi

1.0

parent 76f0856b
package main
import (
"encoding/json"
"flag"
"fmt"
"github.com/tidwall/gjson"
"os"
"search_server/boot"
"search_server/service"
)
func main() {
......@@ -33,15 +34,39 @@ func main() {
//fmt.Println(attrName)
//os.Exit(1)
ss := "LM358"
mouserRes := service.OutLink(&ss,"-1")
for k, mouseItem := range mouserRes {
fmt.Println(k)
fmt.Println(mouseItem.PriceTemp)
//ss := "LM358"
//mouserRes := service.OutLink(&ss,"-1")
//for k, mouseItem := range mouserRes {
// fmt.Println(k)
// fmt.Println(mouseItem.PriceTemp)
// os.Exit(1)
//}
//fmt.Errorf()
jsonstr := `{"goods_id":1156147221172418504,"goods_sn":"","spu_id":"2156147221162468806","update_time":1561472211,"goods_status":3,"goods_name":"RC0603FR-07100KL","goods_type":2,"supplier_id":17,"encoded":"10059","batch_sn":"1148","moq":27961,"mpq":1,"stock":1765,"hk_delivery_time":"","cn_delivery_time":"4\u4e2a\u5de5\u4f5c\u65e5","goods_details":"","ladder_price":[{"purchases":2765,"price_cn":0.01072951425,"price_us":0},{"purchases":45654,"price_cn":0.343434,"price_us":6666}],"goods_images":"","canal":"L0000110","cp_time":0}`
m, ok := gjson.Parse(jsonstr).Value().(map[string]interface{})
if !ok {
fmt.Println(ok)
os.Exit(1)
}
//fmt.Errorf()
goods_id := gjson.Get(jsonstr, "goods_id").String()
ladder := gjson.Get(jsonstr, "ladder_price").Array()
temp1 := []map[string]float64{};
for _,value:=range ladder {
b := value.Map()
temp1 = append(temp1,map[string]float64{
"purchases":b["purchases"].Float(),
"price_cn":b["price_cn"].Float(),
"price_us":b["price_us"].Float(),
})
}
//fmt.Println(ladder)
//
m["goods_id"] = goods_id
m["ladder_price"] = temp1
dd,_ := json.Marshal(m)
fmt.Println(string(dd))
//lines := []string{
// `{"index":{"_index":"hcy1","_type":"goods","_id":"s1"} }`,
......@@ -73,7 +98,6 @@ func main() {
os.Exit(1)
}
//xml := strings.NewReader(resp)
//json, err := xj.Convert(xml)
//if err != nil {
......@@ -83,4 +107,4 @@ func main() {
//json_str := json.String();
////ss := gjson.Get(json_str,"hello").String()
//
//fmt.Println(json_str)
\ No newline at end of file
//fmt.Println(json_str)
......@@ -6,8 +6,10 @@ url = amqp:;guest:guest@192.168.2.232:5672/
MQ_BOM_ITEMS_LIST=bom_items_list
; bom更新数据队列
MQ_BOM_SKU_LIST=bom_sku_list
;联营数据推送入队列-》go后台任务消费(斌哥脚本)
;联营数据更新-推送入队列-》go后台任务消费(斌哥脚本)
SEARCH_SKU_UPDATE_LIST=search_sku_update_list
;联营数据新增-推送入队列-》go后台任务消费(斌哥脚本)
SEARCH_SKU_LIST=search_sku_list
; bom任务id
ZIYING_MQ_BOM_ITEMS_LIST=ziying_bom_items_list
; bom更新数据队列
......
......@@ -22,6 +22,8 @@ SEARCH_API_ERORR_PRE=search_api_overtime_
SEARCH_SHOW_SKU_TIME=search_show_sku_time
;获取关税信息,根据goods_name,brand_name获取
TAX_CUSTOMS_INFO=tax_customs_info
;存放联营外链原始映射
SKU_RAW_MAP=sku_raw_map
[redis_ziyin]
AGG_TABLE=sz_ziying_class_aggs
......
......@@ -4,29 +4,29 @@ import (
"github.com/gin-gonic/gin"
"search_server/model"
"search_server/pkg/common"
"search_server/service"
"search_server/service/ly"
)
//搜索型号
func GetMouserData(c *gin.Context) {
goodsName, _ := c.GetPostForm("goods_name")
lycon := new(service.CommonLyService)
lycon := new(ly.CommonLyService)
//调外链拿数据
apiData := service.OutLink(&goodsName,"1")
apiData := ly.OutLink(&goodsName,"1")
//供应商详情
supplierInfo := model.SUPPLIER_REDIS_INFO_{
SupplierId:14,
SupplierNickname: "mouser",
}
goods := lycon.GetSkuByGoodsSn(apiData,&supplierInfo)
err := lycon.GetSkuByGoodsSn(apiData,&supplierInfo)
var errCode int
if len(goods) == 0 {
if !err {
errCode = 1
}
res := common.BomResponse{
ErrCode: errCode,
ErrMsg: "",
Data: goods,
Data: "",
}
c.JSON(200,res)
}
......@@ -11,6 +11,7 @@ import (
"search_server/pkg/gredis"
"search_server/requests"
"search_server/service"
"search_server/service/ly"
"search_server/service/transformer"
"strings"
)
......@@ -61,7 +62,7 @@ func QuoteIndex(c *gin.Context) {
}
func mouserOrg(keyword, suppliedId string) (result map[string]interface{}, err error) {
mouserRes := service.OutLink(&keyword, "-1")
mouserRes := ly.OutLink(&keyword, "-1")
redisCon := gredis.Conn("search_r")
defer redisCon.Close()
skuMouser := make(map[string]string)
......
......@@ -2,28 +2,35 @@ package model
//联营请求外链后格式化数据
type LyClearGoodsList struct {
GoodsId string `json:"goods_name"` //型号id
GoodsName string `json:"goods_name"` //型号名称
BrandName string `json:"brand_name"` //品牌名称
Desc string `json:"desc"` //描述
GoodsSn string `json:"goods_sn"` //api唯一编码
Docurl string `json:"docurl"` //sku对应供应商的文档路径
Url string `json:"url"` //sku对应供应商的商品详情
GoodsImg string `json:"goods_img"` //sku图片
Cat string `json:"cat"` //分类
Encoded string `json:"encoded"` //内部编码
RestrictionMessage string `json:"RestrictionMessage"` //额外购买限制内容,如 ‘当前商品不在本地区销售’
Increment int64 `json:"increment"` //最小包装量、倍数 =Mpq
SinglePrice float64 `json:"single_price"` //最小单价
Stock int64 `json:"increment"` //库存
Moq int64 `json:"moq"` //最小起订量、起订量
Tiered []*TierItem //价格梯度数量
PriceTemp []interface{} //拼接梯度,目前只有联营推送队列用
SkuId string `json:"sku_id"` //平台型号id (非必填)
SpuId string `json:"spu_id"` //平台spuId (非必填)
BrandId string `json:"brand_id"` //平台品牌id (非必填)
GoodsName string `json:"goods_name"` //型号名称
BrandName string `json:"brand_name"` //品牌名称
Desc string `json:"desc"` //描述
BatchSn string `json:"batch_sn"` //批次号
GoodsSn string `json:"goods_sn"` //api唯一编码
Docurl string `json:"docurl"` //sku对应供应商的文档路径
Url string `json:"url"` //sku对应供应商的商品详情
GoodsImg string `json:"goods_img"` //sku图片
Cat string `json:"cat"` //分类
Encap string `json:"encap"` //包装
Canal string `json:"canal"` //渠道标签
Encoded string `json:"encoded"` //内部编码
RestrictionMessage string `json:"RestrictionMessage"` //额外购买限制内容,如 ‘当前商品不在本地区销售’
Increment int64 `json:"increment"` //最小包装量、倍数 =Mpq
SinglePrice float64 `json:"single_price"` //最小单价
Stock int64 `json:"increment"` //库存
Moq int64 `json:"moq"` //最小起订量、起订量
RawGoodsId string `json:"raw_goods_id"` //外链原始goods_sn,如digikey:{'raw_goods_id': 'AT28C64X-25PC-ND', 'raw_brand_name': 'Microchip Technology'}
RawBrandName string `json:"raw_brand_name"` //外链原始品牌名称,如digikey:{'raw_goods_id': 'AT28C64X-25PC-ND', 'raw_brand_name': 'Microchip Technology'}
Tiered []*TierItem //价格梯度数量
PriceTemp []interface{} //拼接梯度,目前只有联营推送队列用
}
type TierItem struct {
Purchases uint64 //购买数量
PriceUs float64 //数量对应的英文价格
PriceCn float64 //数量对应的中文价格
Purchases uint64 `json:"purchases"` //购买数量
PriceUs float64 `json:"price_us"` //数量对应的英文价格
PriceCn float64 `json:"price_cn"` //数量对应的中文价格
PriceAc float64 `json:"price_ac"`
}
......
......@@ -126,7 +126,6 @@ func NumberToHtml(number int) (html string) {
}
return
}
/**
* 生成纯小写字母的字符串
* 返回形式如下 : yuiopkdsi rnvewjeil xmiqplmza
......
package logger
import (
"io"
"os"
"time"
"strings"
)
func check(e error) {
if e != nil {
panic(e)
}
}
/**
* 判断文件是否存在 存在返回 true 不存在返回false
*/
func checkFileIsExist(filename string) bool {
var exist = true
if _, err := os.Stat(filename); os.IsNotExist(err) {
exist = false
}
return exist
}
/*
@param writeString 写入文件字符串
@param file_pre 附加文件前缀
eg: logic.Loginfo("逾期统计开始","_yuqilv_");
*/
func Log(writeString string,log_file_pre string) {
log_file_pre = "_"+log_file_pre
date := time.Now().Format("2006-01-02")
date2 := time.Now().Format("2006-01-02 15:04:05")
var filename = "./logs/"+date+log_file_pre+".txt"
var f *os.File
var err1 error
if checkFileIsExist(filename) { //如果文件存在
f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
} else {
f, err1 = os.Create(filename) //创建文件
}
check(err1)
ss := StrReplace("\r\n","",writeString,1) //替换多余换行
io.WriteString(f,"\r\n"+date2+"----"+ss) //写入文件(字符串)
//fmt.Print(err)
}
// StrReplace str_replace()
func StrReplace(search, replace, subject string, count int) string {
return strings.Replace(subject, search, replace, count)
}
package service
package ly
/*
等同于 php.search_server.middleBaseController
联营请求外链后 更新或者新增到平台 (es,redis,rabmq)
*/
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gomodule/redigo/redis"
"github.com/syyongx/php2go"
"github.com/tidwall/gjson"
"search_server/middleware"
"search_server/model"
"search_server/pkg/common"
"search_server/pkg/config"
"search_server/pkg/es"
"search_server/pkg/gredis"
"search_server/pkg/logger"
"search_server/pkg/mq"
"search_server/pkg/mysql"
"strconv"
"strings"
"fmt"
"encoding/json"
)
//定义类名
type CommonLyService struct {
......@@ -51,52 +53,110 @@ func (t *CommonLyService) LyServerRun(){
}
/*
联营公共类
联营入口
联营大类,包括修改新增 sku es redis ,推送数据到队列让其他go服务更新数据到mysql
@param goods_list 请求联营格式化后的数据
@param supplier_info 供应商商品详情
*/
func (t *CommonLyService) GetSkuByGoodsSn(goodsList map[string]*model.LyClearGoodsList,supplierInfo *model.SUPPLIER_REDIS_INFO_) map[string]interface{}{
func (t *CommonLyService) GetSkuByGoodsSn(goodsList map[string]*model.LyClearGoodsList,supplierInfo *model.SUPPLIER_REDIS_INFO_) bool {
t.LyServerRun(); //初始化变量
redisRead := gredis.Conn("search_r")
defer redisRead.Close()
redisWrite := gredis.Conn("search_w")
defer redisWrite.Close()
t.supplierId = supplierInfo.SupplierId
t.supplierName = supplierInfo.SupplierNickname
_,haveLimitTime := t.supplier_over_time[supplierInfo.SupplierNickname] //获取当前供应商更新周期
originGoods := make(map[string]interface{},0)
for goodsSn, info := range goodsList {
for goods_sn, info := range goodsList {
snSku := php2go.Md5(strings.ToLower(goodsSn))
skuId,_ := gredis.String(redisWrite.Do("HGET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),snSku)) //查询唯一值,反查sku_id
snSku := php2go.Md5(strings.ToLower(goods_sn))
skuId,_ := gredis.String(redisRead.Do("HGET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),snSku)) //查询唯一值,反查sku_id
var sku_flag bool = false; //是否新增或者更新db+redis,为true则新增
if skuId == "" { //为空,先创建sku
/**********新增sku**************/
skuFlag := false; //是否新增或者更新db+redis,为true则新增
if skuId == "" { //redis没有此sku,创建
lock_key := "searchapi_"+snSku;
flag,_ := redis.Bool(redisRead.Do("SETNX", lock_key,php2go.Time()+2))
if flag { //不存在锁,直接新增
sku_flag = true
redisRead.Do("EXP",lock_key,2) //给锁有效时间2秒
//sku_id = t.writeSkuInfo(info)
}else{ //存在锁
flag,_ := redis.Bool(redisWrite.Do("SETNX", lock_key,php2go.Time()+2))
if !flag { //防止并发
continue;
}
//新增操作
skuFlag = true //新增标志
redisWrite.Do("EXP",lock_key,2) //给锁有效时间2秒
skuId = t.writeSkuInfo(info,"") //新增redis+sku+spu+brand
redisWrite.Do("del",lock_key) //删除锁
}
info.SkuId = skuId;
//获取sku存在redis的详情
redisData,_ := redis.String(redisWrite.Do("HGET",config.Get("redis_all.SKU").String(),skuId))
if redisData == "" {
logger.Log("此sku不存在redis" + skuId,"redis_get_sku_error")
continue;
}
redisArr, ok := gjson.Parse(redisData).Value().(map[string]interface{}) //redis取值转成map
if !ok {
logger.Log("此sku不是正确json格式" + redisData,"redis_get_sku_error")
continue;
}
//获取spu详情
spuId := gjson.Get(redisData,"spu_id").String();
spuStr,_ := redis.String(redisWrite.Do("HGET",config.Get("redis_all.SPU").String(),spuId))
info.SpuId = spuId //平台spuid
info.BrandId = gjson.Get(spuStr,"brand_id").String(); //平台品牌id
if skuFlag { //如果是新增
t.createSkuDB(info) //推入队列->(斌队列消费写redis+go+mongodb)
t.esSkuInfo(info) //新增es数据
}
/**********更新sku**************/
//计算更新周期
var isUpdate int64 //是否到时间更新sku
if haveLimitTime {
isUpdate = php2go.Time()-gjson.Get(redisData,"update_time").Int()-t.supplier_over_time[supplierInfo.SupplierNickname]
}
if isUpdate > 0 && !skuFlag { //需要更新
//更新redis->sku
redisArr["moq"] = info.Moq
redisArr["stock"] = info.Stock
redisArr["mpq"] = info.Moq
redisArr["goods_status"] = 1
redisArr["is_expire"] = 0
redisArr["ladder"] = info.Tiered
redisArr["update_time"] = php2go.Time()
if supplierInfo.SupplierId == 14 {
redisArr["cp_time"] = 0
}
redisJson,_ := json.Marshal(redisArr)
redisWrite.Do("HSET",config.Get("redis_all.SKU").String(),redisJson)
//更新redis->商品映射
if supplierInfo.SupplierId == 7 {
skuMapJson,_ := json.Marshal(map[string]string{
"raw_goods_id":info.RawGoodsId, //原始goods_sn
"raw_brand_name":info.RawBrandName, //原始品牌名称
})
redisWrite.Do("HSET",config.Get("redis_all.SKU_RAW_MAP").String(),skuMapJson)
}
//更新db
t.updateSkuDB(info)
//更新es
t.esSkuInfo(info)
}
print(info)
print(sku_flag)
//productList[goodsSn] = &LyClearGoodsList
}
fmt.Println(originGoods)
return originGoods
t.pushEs(); //最后推送ES
return true
}
/*
生成或者更新 sku信息
*/
func (t *CommonLyService) writeSkuInfo(skuInfo *model.LyClearGoodsList,skuId string,) {
func (t *CommonLyService) writeSkuInfo(skuInfo *model.LyClearGoodsList,skuId string) string {
redisWrite := gredis.Conn("search_w")
defer redisWrite.Close()
......@@ -139,7 +199,7 @@ func (t *CommonLyService) writeSkuInfo(skuInfo *model.LyClearGoodsList,skuId str
if t.supplierId == 7 {
redisWrite.Do("HSET",config.Get("redis_all.SKU_RAW_MAP").String(),skuKey,skuId)
}
return skuId
}
/*
......@@ -217,7 +277,7 @@ func (t *CommonLyService) writeBrandInfo(skuInfo *model.LyClearGoodsList) int64
/*
组装推送到es数据
*/
func (t * CommonLyService) EsSkuInfo(skuInfo *model.LyClearGoodsList,spuId * string,brandId *string) {
func (t * CommonLyService) esSkuInfo(skuInfo *model.LyClearGoodsList) {
sort := 1; //排序
if skuInfo.SinglePrice >0 && skuInfo.Stock >0 && skuInfo.Stock >= skuInfo.Increment && skuInfo.Stock >= skuInfo.Moq {
sort = 31;
......@@ -240,16 +300,16 @@ func (t * CommonLyService) EsSkuInfo(skuInfo *model.LyClearGoodsList,spuId * str
nowTime := php2go.Time()
param := map[string]interface{}{
"goods_id":skuInfo.GoodsId,
"goods_id":skuInfo.SkuId,
"goods_name":skuInfo.GoodsName,
"auto_goods_name":php2go.Strtoupper(skuInfo.GoodsName),
"brand_id":*brandId,
"brand_id":skuInfo.BrandId,
"brand_name":skuInfo.BrandName,
"supplier_name":t.supplierName,
"class_id1":0,
"class_id2":0,
"class_id3":0,
"spu_id":*spuId,
"spu_id":skuInfo.SpuId,
"sale_time":nowTime,
"create_time":nowTime,
"update_time":nowTime,
......@@ -266,7 +326,7 @@ func (t * CommonLyService) EsSkuInfo(skuInfo *model.LyClearGoodsList,spuId * str
}
paramjson,_ := json.Marshal(param)
t.skuEsUpdataList = append(t.skuEsUpdataList,`{"index":{"_index":"`+t.supplierName+`","_type":"goods","_id":"`+skuInfo.GoodsId+`"}}`)
t.skuEsUpdataList = append(t.skuEsUpdataList,`{"index":{"_index":"`+t.supplierName+`","_type":"goods","_id":"`+skuInfo.SkuId+`"}}`)
t.skuEsUpdataList = append(t.skuEsUpdataList,string(paramjson))
}
......@@ -275,7 +335,7 @@ func (t * CommonLyService) EsSkuInfo(skuInfo *model.LyClearGoodsList,spuId * str
推入队列=》(斌 go队列去消费更新db+mongodb..等操作)
*/
func (t * CommonLyService) updateSkuDB(skuInfo *model.LyClearGoodsList) {
if skuInfo.GoodsId == "" {
if skuInfo.SkuId == "" {
return
}
param := map[string]interface{}{
......@@ -283,7 +343,7 @@ func (t * CommonLyService) updateSkuDB(skuInfo *model.LyClearGoodsList) {
"stock":skuInfo.Stock,
"tiered":skuInfo.PriceTemp,
"increment":skuInfo.Increment,
"sku_id":skuInfo.GoodsId,
"sku_id":skuInfo.SkuId,
"brand_name":skuInfo.BrandName,
"goods_name":skuInfo.GoodsName,
"goods_sn":skuInfo.GoodsSn,
......@@ -317,3 +377,44 @@ func (t *CommonLyService) pushEs() {
t.flagStr += result
}
}
/*
新增sku,组装好数据推送到db(斌哥队列消费后 更新 mongodb+mysql 等)
*/
func (t * CommonLyService) createSkuDB(skuInfo *model.LyClearGoodsList) {
if skuInfo.SkuId == "" {
return
}
param := map[string]interface{}{
"desc":skuInfo.Desc,
"docurl":skuInfo.Docurl,
"goods_img":skuInfo.GoodsImg,
"url":skuInfo.Url,
"spu_id":skuInfo.SpuId,
"brand_id":skuInfo.BrandId,
"batch_sn":skuInfo.BatchSn,
"canal":skuInfo.Canal,
"encoded":skuInfo.Encoded,
"encap":skuInfo.Encap,
"pn":t.supplierName,
"stock":skuInfo.Stock,
"tiered":skuInfo.PriceTemp,
"increment":skuInfo.Increment,
"sku_id":skuInfo.SkuId,
"brand_name":skuInfo.BrandName,
"goods_name":skuInfo.GoodsName,
"goods_sn":skuInfo.GoodsSn,
}
paramjson,_ := json.Marshal(param)
paramStr := string(paramjson)
if t.flag == "101" {
t.flagStr = "<br/><br/>";
t.flagStr = "推送到go新增db:";
t.flagStr = paramStr;
t.flagStr = "<br/><br/>";
}
mq.PushMsg(config.Get("rabmq_all.SEARCH_SKU_LIST").String(),paramStr) //推送队列
//记录日志
logger.Log(paramStr,"sku_create")
}
package service
package ly
import (
"github.com/imroc/req"
......
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