package service import ( "github.com/gin-gonic/gin" "github.com/gomodule/redigo/redis" "github.com/iancoleman/orderedmap" "github.com/syyongx/php2go" "github.com/tidwall/gjson" "go_sku_server/model" "go_sku_server/pkg/common" "go_sku_server/pkg/gredis" ) //自营公共函数类 /* 计算单个sku总锁库数量 */ func (qs *ZiyingService) skuLockNum(c *redis.Conn,goodsId string) int64{ reply, err := redis.Values((*c).Do("hvals", "Self_StockLock"+goodsId)) if err != nil { return 0; } var albums []int64 if err := redis.ScanSlice(reply, &albums); err != nil { return 0; } if len(albums) == 0 { return 0; }else{ var all int64 = 0 for _,n := range albums { all = all+n } return all } } /* 获取自营活动价 */ func (qs *ZiyingService) ActivityPrice(ctx *gin.Context,SkuInfo string,c *redis.Conn) *orderedmap.OrderedMap { //新客价处理 if ctx.Request.FormValue("power[newCustomer]") == "true" || ctx.Request.FormValue("power[newCustomer]") == "1" { goodsActivityPrice,_ := gredis.String((*c).Do("get","Self_ActivityPrice_10000_NewCustomer")) if goodsActivityPrice != "" { data := qs.HDActivityPrice(ctx,goodsActivityPrice,SkuInfo,"5") if data != nil { return data } } } //团购限制 data := qs.HDGoodsLimit(gjson.Get(SkuInfo,"goods_id").String(),gjson.Get(SkuInfo,"stock").String(),c) if data != nil { return data } //活动价 GoodsActivityPrice,_ := gredis.String((*c).Do("get","Self_ActivityPrice_10000")) if GoodsActivityPrice != "" { data := qs.HDActivityPrice(ctx,GoodsActivityPrice,SkuInfo,"2") if data != nil { return data } } //会员价 GoodsActivityPrice,_ = gredis.String((*c).Do("get","Self_ActivityPrice_10000_Member")) if GoodsActivityPrice != "" { data := qs.HDActivityPrice(ctx,GoodsActivityPrice,SkuInfo,"3") if data != nil { return data } } return nil } /* 计算活动价 ac_type说明: 0 没有活动 活动名称 ac_type 类型 限时限量活动 1 自营 活动价 2 自营 and 联营 会员价 3 自营 and 联营 折扣价(废除)4 自营 and 联营 新客价 5 自营 and 联营 自营系数 6 自营 团购价 7 联营 折扣价 8 自营 and 联营 */ func (qs *ZiyingService) HDActivityPrice(ctx *gin.Context,GoodsActivityPrice string,SkuInfo string,Actype string) *orderedmap.OrderedMap { visible_roster := gjson.Get(GoodsActivityPrice,"visible_roster").String() activity_id := gjson.Get(GoodsActivityPrice,"activity_id").String() is_part := gjson.Get(GoodsActivityPrice,"is_part").String() activity_type := gjson.Get(GoodsActivityPrice,"activity_type").String() Ratio := true //是否符合活动价 if Actype == "5" { //新客价 ratio_goods_id := gjson.Get(GoodsActivityPrice,"goods_id").String() //活动型号id ratio_brand_id := gjson.Get(GoodsActivityPrice,"brand_id").String() //活动品牌id ratio_class_id := gjson.Get(GoodsActivityPrice,"class_id").String() //活动分类id //指定参与新客价型号 if ratio_goods_id != "" { if php2go.Stripos(","+ratio_goods_id+",",","+gjson.Get(SkuInfo,"goods_id").String()+",",0) == -1 { Ratio = false; //不符合新客价 goto End } } //指定品牌 if ratio_brand_id != "" { if php2go.Stripos(","+ratio_brand_id+",",","+gjson.Get(SkuInfo,"brand_id").String()+",",0) == -1 { Ratio = false; //不符合新客价 goto End } } //指定分类 if ratio_class_id != "" { if php2go.Stripos(","+ratio_class_id+",",","+gjson.Get(SkuInfo,"class_id2").String()+",",0) == -1 { Ratio = false; //不符合新客价 goto End } } }else{ if !common.GInArray(GoodsActivityPrice,"brand_id",gjson.Get(SkuInfo,"brand_id").String()) { Ratio = false; //不符合活动价 goto End } if !common.GInArray(GoodsActivityPrice,"class_id",gjson.Get(SkuInfo,"class_id2").String()) { Ratio = false; //不符合活动价 goto End } //会员价处理 if Actype == "3" && is_part == "1" && visible_roster != "" { visible_roster = ","+visible_roster+"," if php2go.Stripos(visible_roster,","+ctx.Request.FormValue("power[user_id]")+",",0) == -1 || php2go.Stripos(visible_roster,","+ctx.Request.FormValue("power[mobile]")+",",0) == -1 || php2go.Stripos(visible_roster,","+ctx.Request.FormValue("power[email]")+",",0) == -1 { Ratio = false; //不符合新客价 goto End } } //处理黑名单,只有折扣活动才有黑名单,并且是下单页面,debug if Actype == "2" && activity_id != "" && activity_type == "2" && ctx.Request.FormValue("power[verify_blacklist]") == "true" { //redisConn := gredis.Conn("search_r") //defer redisConn.Close(); // //blacklist, _ := redis.String(redisConn.Do("hget", "activity_roster",activity_id+"_1")) //blacklist_type := config.Cfg.Section("blacklist_type").KeysHash() // //blacklistArr := php2go.Explode(",",blacklist) //for p,d := range blacklist_type { // // //backval,ok := blacklist_type[d] // // if php2go.Stripos(visible_roster,","+middleware.REQUEST["power[user_id]"]+",",0) == -1 { // Ratio = false; //不符合新客价 // goto End // } //} } } End: //最终执行 if Ratio { discount_type := gjson.Get(GoodsActivityPrice,"discount_type").String() ratio := gjson.Get(GoodsActivityPrice,"ratio").Float() //当前活动折扣 ladder_price_arr := gjson.Get(SkuInfo,"ladder_price").Array() A := orderedmap.New(); ladderType := make([]model.LadderPrice,0) for _,v := range ladder_price_arr{ if Actype != "7" || (Actype =="7" && discount_type != "") || discount_type == "1" { price_cn := v.Get("price_cn").Float() price_ac := php2go.Round(price_cn*ratio/100) ladderType = append(ladderType, model.LadderPrice{ Purchases: v.Get("Purchases").Int(), PriceUs: v.Get("price_us").Float(), PriceCn: price_cn, PriceAc: price_ac, }) } } A.Set("ratio",ratio) A.Set("ac_type",Actype) A.Set("allow_coupon",ratio) A.Set("activity_end_time",ratio) A.Set("activity_info",ratio) return A } return nil } /* 获取当前锁住的库存 */ func (qs *ZiyingService) HDGoodsLimit(SkuID string,Stock string,c *redis.Conn) *orderedmap.OrderedMap { GoodsLimit, _ := redis.String((*c).Do("get", "Self_GoodsLimit_"+SkuID)) if GoodsLimit == "" { return nil } start_time := gjson.Get(GoodsLimit,"start_time").Int() end_time := gjson.Get(GoodsLimit,"end_time").Int() buy_stock := gjson.Get(GoodsLimit,"buy_stock").Float() ac_stock := gjson.Get(GoodsLimit,"ac_stock").Float() schedule := gjson.Get(GoodsLimit,"schedule").Float() allow_coupon := gjson.Get(GoodsLimit,"allow_coupon").Int() if start_time < php2go.Time() && end_time >php2go.Time() { buy := buy_stock/ac_stock*100 schedule := common.MyRound(buy+schedule,2) if schedule < 100 { A := orderedmap.New(); //拼接梯度价格 ladder_price_arr := gjson.Get(GoodsLimit,"ac_price").Array() ladderType := make([]model.LadderPrice,0) for _,v := range ladder_price_arr{ ladderType = append(ladderType, model.LadderPrice{ Purchases: v.Get("Purchases").Int(), PriceCn: v.Get("price_cn").Float(), PriceAc: v.Get("price_ac").Float(), }) } now_stock := ac_stock*((100-schedule)/100) A.Set("ac_type",1) A.Set("ac_id",gjson.Get(GoodsLimit,"id").Int()) A.Set("ladder_price",ladderType) A.Set("ac_stock",ac_stock) A.Set("stock",now_stock) A.Set("schedule",schedule) A.Set("activity_end_time",end_time) if allow_coupon >0 { A.Set("allow_coupon",allow_coupon) }else{ A.Set("allow_coupon",1) } //活动库存大于当前可售库存,强制结束活动 if now_stock > common.MyFloat64(Stock) || now_stock == 0 { return nil } return A } } return nil }