package service /* 等同于 php.search_server.middleBaseController 联营请求外链后 更新或者新增到平台 (es,redis,rabmq) */ import ( "github.com/gin-gonic/gin" "github.com/gomodule/redigo/redis" "github.com/syyongx/php2go" "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/mq" "search_server/pkg/mysql" "strconv" "strings" "fmt" "encoding/json" ) //定义类名 type CommonLyService struct { supplier_over_time map[string]int64 supplierId int64 //调用当前方法的供应商ID supplierName string //调用当前方法的供应商名称 skuEsUpdataList []string //组装批量更新es数据 flag string //调试开关 flagStr string //调试输出内容 ctx *gin.Context } //初始化类 func (t *CommonLyService) LyServerRun(){ t.supplier_over_time = map[string]int64{ "arrow":3600, "verical":3600, "mouser":3600, "master":3600, "tme":3600, "buerklin":3600, } t.ctx = middleware.Context t.ctx.MultipartForm() for requestName, requstValue := range t.ctx.Request.Form { if requestName == "flag" { t.flag = strings.TrimSpace(requstValue[0]) } } } /* 联营公共类 联营大类,包括修改新增 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{}{ t.LyServerRun(); //初始化变量 redisRead := gredis.Conn("search_r") defer redisRead.Close() t.supplierId = supplierInfo.SupplierId t.supplierName = supplierInfo.SupplierNickname originGoods := make(map[string]interface{},0) for goods_sn, info := range goodsList { 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 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{ //存在锁 } } print(info) print(sku_flag) //productList[goodsSn] = &LyClearGoodsList } fmt.Println(originGoods) return originGoods } /* 生成或者更新 sku信息 */ func (t *CommonLyService) writeSkuInfo(skuInfo *model.LyClearGoodsList,skuId string,) { redisWrite := gredis.Conn("search_w") defer redisWrite.Close() spuKey := common.GetKey(skuInfo.GoodsName+"_"+skuInfo.BrandName) spuId,_ := gredis.String(redisWrite.Do("HGET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),spuKey)) if spuId == "" { //不存在spu,创建新的spu spuId = t.writeSpuInfo(skuInfo) } if skuId == "" { skuId = common.CreateId("sku"); } inSkuInfo := model.LySkuInfo{ SpuId: spuId, Encoded: "", Moq: skuInfo.Moq, Mpq: skuInfo.Increment, OldGoodsId: 0, GoodsType: 1, GoodsStatus: 1, BatchSn:"", Stock:skuInfo.Stock, HkDeliveryTime: "", CnDeliveryTime: "", LadderPrice: skuInfo.Tiered, UpdateTime: php2go.Time(), GoodsImages: "", Canal: "", SupplierId:t.supplierId, } jsonStr, _ := json.Marshal(inSkuInfo) redisWrite.Do("HSET","sku",spuId,jsonStr) skuKey := common.GetKey(skuInfo.GoodsSn+"_"+strconv.FormatInt(t.supplierId,10)) redisWrite.Do("HSET",config.Get("redis_all.SKU_UNIQUE_JUDGE").String(),skuKey,skuId) //todo 如果是digikey新增,需要插入原始映射表 if t.supplierId == 7 { redisWrite.Do("HSET",config.Get("redis_all.SKU_RAW_MAP").String(),skuKey,skuId) } } /* 生成spu */ func (t *CommonLyService) writeSpuInfo(skuInfo *model.LyClearGoodsList) string { redisWrite := gredis.Conn("search_w") defer redisWrite.Close() brand_key := common.GetKey(strings.ToLower(skuInfo.BrandName)) brandId,_ := redis.Int64(redisWrite.Do("HGET", config.Get("redis_all.BRAND_NAME_ALL").String(),brand_key)) if brandId == 0 { brandId,_ = redis.Int64(redisWrite.Do("HGET",config.Get("redis_all.SUPPLIER_BRAND_ALL").String(),brand_key)) if brandId == 0 { brandId = t.writeBrandInfo(skuInfo) } } spuId := common.CreateId("spu") //创建spu的id Spuinfo := model.LySpuInfo{ ClassId1:0, ClassId2:0, ClassId3:0, BrandId:brandId, SpuName:skuInfo.GoodsName, Status:1, ImagesL:"", Encap:"", Pdf:"", SpuBrief:"", UpdateTime:php2go.Time(), } jsonStr, _ := json.Marshal(Spuinfo) redisWrite.Do("HSET","spu",spuId,jsonStr) spuKey := common.GetKey(skuInfo.GoodsName+"_"+skuInfo.BrandName) redisWrite.Do("HSET",config.Get("redis_all.SPU_UNIQUE_JUDGE").String(),spuKey,spuId) return spuId } /* 生成品牌 */ func (t *CommonLyService) writeBrandInfo(skuInfo *model.LyClearGoodsList) int64 { var ( dbSpu = mysql.Conn("spu") //spu实例化链接 brandId int64 //品牌id brandkey = common.GetKey(skuInfo.BrandName) //品牌唯一值 redisWrite = gredis.Conn("search_w") ) defer redisWrite.Close() has, err := dbSpu.Table("brand").Where("brand_name = ?", skuInfo.BrandName).Cols("id").Get(&brandId) if err != nil { fmt.Println(err) //查询错误 return 0 } if has {//不存在品牌,则创建品牌 sql :="insert into brand(brand_name,create_time,insert_type) values (?, ?, ?)" results, err := dbSpu.Exec(sql,skuInfo.BrandName, php2go.Time(),1) if err != nil { fmt.Println(err) //查询错误 return 0 } brandId,_ = results.LastInsertId() } //更新redis 品牌数据 redisWrite.Do("HSET",config.Get("redis_all.BRAND_NAME_ALL").String(),brandkey,brandId) redisWrite.Do("HSET",config.Get("redis_all.BRAND").String(),brandkey,brandId) return brandId; } /* 组装推送到es数据 */ func (t * CommonLyService) EsSkuInfo(skuInfo *model.LyClearGoodsList,spuId * string,brandId *string) { sort := 1; //排序 if skuInfo.SinglePrice >0 && skuInfo.Stock >0 && skuInfo.Stock >= skuInfo.Increment && skuInfo.Stock >= skuInfo.Moq { sort = 31; }else if skuInfo.SinglePrice >0 && skuInfo.Stock >0 { sort = 30; }else if skuInfo.SinglePrice > 0 { sort = 28; }else if skuInfo.Stock >0 { sort = 29; } stock_sort := 1; if skuInfo.Stock > 0 { stock_sort = 3; } single_price_sort := 1; if skuInfo.SinglePrice > 0 { single_price_sort = 3; } nowTime := php2go.Time() param := map[string]interface{}{ "goods_id":skuInfo.GoodsId, "goods_name":skuInfo.GoodsName, "auto_goods_name":php2go.Strtoupper(skuInfo.GoodsName), "brand_id":*brandId, "brand_name":skuInfo.BrandName, "supplier_name":t.supplierName, "class_id1":0, "class_id2":0, "class_id3":0, "spu_id":*spuId, "sale_time":nowTime, "create_time":nowTime, "update_time":nowTime, "single_price":skuInfo.SinglePrice, "stock":skuInfo.Stock, "goods_status":1, "status":1, "sort":sort, "encoded": "", "encap":"", "canal_new":"", "stock_sort":stock_sort, //主要为库存为0的往后排服务 "single_price_sort":single_price_sort, //主要为单价为0的往后排服务 } paramjson,_ := json.Marshal(param) t.skuEsUpdataList = append(t.skuEsUpdataList,`{"index":{"_index":"`+t.supplierName+`","_type":"goods","_id":"`+skuInfo.GoodsId+`"}}`) t.skuEsUpdataList = append(t.skuEsUpdataList,string(paramjson)) } /* 推入队列=》(斌 go队列去消费更新db+mongodb..等操作) */ func (t * CommonLyService) updateSkuDB(skuInfo *model.LyClearGoodsList) { if skuInfo.GoodsId == "" { return } param := map[string]interface{}{ "pn":t.supplierName, "stock":skuInfo.Stock, "tiered":skuInfo.PriceTemp, "increment":skuInfo.Increment, "sku_id":skuInfo.GoodsId, "brand_name":skuInfo.BrandName, "goods_name":skuInfo.GoodsName, "goods_sn":skuInfo.GoodsSn, } paramjson,_ := json.Marshal(param) if t.flag == "101" { t.flagStr = "<br/><br/>"; t.flagStr = "推送到go更新db:"; t.flagStr = string(paramjson); t.flagStr = "<br/><br/>"; } mq.PushMsg(config.Get("rabmq_all.SEARCH_SKU_UPDATE_LIST").String(),string(paramjson)) } /* 批量插入或者更新es */ func (t *CommonLyService) pushEs() { if len(t.skuEsUpdataList) == 0 { if t.flag == "101" { t.flagStr += "<br/>没有可插入es的数据" } return } param := strings.Join(t.skuEsUpdataList, "\n")+"\n" result,_ := es.BulkES(param) //批量插入 if t.flag == "101" { t.flagStr += "<br/>" t.flagStr += "插入es:" t.flagStr += param t.flagStr += result } }