@@ -2,6 +2,7 @@ package logic
import (
"errors"
"fmt"
"fusenapi/model/gmodel"
"fusenapi/utils/auth"
"fusenapi/utils/basic"
@@ -74,6 +75,19 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
for _ , v := range tagList {
typeIds = append ( typeIds , v . Id )
}
var (
productList [ ] gmodel . FsProduct //产品列表( select 字段需要看查询的地方)
recommendProductList [ ] gmodel . FsProduct //tag推荐产品列表( select 字段需要看查询的地方)
mapProduct = make ( map [ int64 ] int ) //产品map
productPriceList [ ] gmodel . GetPriceListByProductIdsRsp //产品价格列表( select 字段需要看查询的地方)
mapProductMinPrice = make ( map [ int64 ] int64 ) //产品最小价格map
productTemplatesV2 [ ] gmodel . FsProductTemplateV2 //产品模板列表( select 字段需要看查询的地方)
productSizeCountList [ ] gmodel . CountProductSizeByStatusRsp //产品尺寸数量列表( select 字段需要看查询的地方)
mapProductSizeCount = make ( map [ int64 ] int64 ) //产品尺寸数量map
mapProductTemplate = make ( map [ int64 ] struct { } ) //产品模板map
)
//携带产品
if req . WithProduct {
//查询符合的产品列表
pIsDel := int64 ( 0 )
pStatus := int64 ( 1 )
@@ -86,23 +100,51 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
OrderBy : "`sort` DESC" ,
}
//获取产品列表
productList , err : = l . svcCtx . AllModels . FsProduct . GetProductListByParams ( l . ctx , pReq )
productList , err = l . svcCtx . AllModels . FsProduct . GetProductListByParams ( l . ctx , pReq )
if err != nil {
logx . Error ( err )
return resp . SetStatusWithMessage ( basic . CodeServiceErr , "failed to get product list" )
}
//提取tag推荐产品
allTagRecommendProductIds := make ( [ ] int64 , 0 , len ( tagList ) * 5 )
for _ , v := range tagList {
if v . RecommendProduct == nil || * v . RecommendProduct == "" {
continue
}
sl , err := format . StrSlicToInt64Slice ( strings . Split ( * v . RecommendProductSort , "," ) )
if err != nil {
logx . Error ( err )
return resp . SetStatusWithMessage ( basic . CodeServiceErr , fmt . Sprintf ( "failed to parse recommend product ids,id=%d" , v . Id ) )
}
allTagRecommendProductIds = append ( allTagRecommendProductIds , sl ... )
}
//获取推荐的产品列表
recommendProductList , err = l . svcCtx . AllModels . FsProduct . FindAllOnlyByIds ( l . ctx , allTagRecommendProductIds )
if err != nil {
logx . Error ( err )
return resp . SetStatusWithMessage ( basic . CodeDbSqlErr , "failed to get tag recommend products" )
}
//提取产品ids
productIds := make ( [ ] int64 , 0 , len ( productList ) )
for _ , v := range productList {
for k , v := range productList {
productIds = append ( productIds , v . Id )
mapProduct [ v . Id ] = k
}
productPriceList , err := l . svcCtx . AllModels . FsProductPrice . GetSimplePriceListByProductIds ( l . ctx , productIds )
//合并产品列表
for _ , v := range recommendProductList {
//存在则不并入
if _ , ok := mapProduct [ v . Id ] ; ok {
continue
}
productList = append ( productList , v )
mapProduct [ v . Id ] = len ( productList ) - 1
}
productPriceList , err = l . svcCtx . AllModels . FsProductPrice . GetSimplePriceListByProductIds ( l . ctx , productIds )
if err != nil {
logx . Error ( err )
return resp . SetStatusWithMessage ( basic . CodeServiceErr , "failed to get product min price list" )
}
//存储产品最小价格
mapProductMinPrice := make ( map [ int64 ] int64 )
for _ , v := range productPriceList {
priceStrSlic := strings . Split ( v . Price , "," )
priceSlice , err := format . StrSlicToIntSlice ( priceStrSlic )
@@ -117,25 +159,24 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
mapProductMinPrice [ v . ProductId ] = int64 ( priceSlice [ 0 ] )
}
//获取模板(只是获取产品product_id)
productTemplatesV2 , err : = l . svcCtx . AllModels . FsProductTemplateV2 . FindAllByProductIds ( l . ctx , productIds , "product_id" )
productTemplatesV2 , err = l . svcCtx . AllModels . FsProductTemplateV2 . FindAllByProductIds ( l . ctx , productIds , "product_id" )
if err != nil {
logx . Error ( err )
return resp . SetStatusWithMessage ( basic . CodeServiceErr , "get product template_v2 err" )
}
mapProductTemplate := make ( map [ int64 ] struct { } )
for _ , v := range productTemplatesV2 {
mapProductTemplate [ * v . ProductId ] = struct { } { }
}
//获取产品尺寸数量
productSizeCountList , err : = l . svcCtx . AllModels . FsProductSize . GetGroupProductSizeByStatus ( l . ctx , productIds , 1 )
productSizeCountList , err = l . svcCtx . AllModels . FsProductSize . GetGroupProductSizeByStatus ( l . ctx , productIds , 1 )
if err != nil {
logx . Error ( err )
return resp . SetStatusWithMessage ( basic . CodeServiceErr , "get product size count err" )
}
mapProductSizeCount := make ( map [ int64 ] int64 )
for _ , v := range productSizeCountList {
mapProductSizeCount [ v . ProductId ] = v . Num
}
}
mapTagLevel := make ( map [ string ] * types . TagItem )
minLevel := int64 ( 0 ) //记录最小等级数字
for _ , tagInfo := range tagList {
@@ -145,6 +186,24 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
if minLevel > * tagInfo . Level {
minLevel = * tagInfo . Level
}
tagTem := types . TagItem {
TagProductList : nil ,
TagRecommendProductList : nil ,
TypeName : * tagInfo . Title ,
TypeId : tagInfo . Id ,
Level : * tagInfo . Level ,
LevelPrefix : * tagInfo . LevelPrefix ,
Icon : * tagInfo . Icon ,
Sort : * tagInfo . Sort ,
Description : * tagInfo . Description ,
ChildTagList : make ( [ ] * types . TagItem , 0 , 100 ) ,
}
//不携带产品
if ! req . WithProduct {
//加入分类
mapTagLevel [ * tagInfo . LevelPrefix ] = & tagTem
continue
}
//获取分类产品列表
productListRsp := l . getTagProducts ( getTagProductsReq {
TagId : tagInfo . Id ,
@@ -155,19 +214,12 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
Size : req . Size ,
User : user ,
} )
//加入分类
tagTem := types . TagItem {
T agProductList : productListRsp ,
TypeName : * tagInfo . Title ,
TypeId : tagInfo . Id ,
Level : * tagInfo . Level ,
LevelPrefix : * tagInfo . LevelPrefix ,
Icon : * tagInfo . Icon ,
Sort : * tagInfo . Sort ,
Description : * tagInfo . Description ,
ChildTagList : make ( [ ] * types . TagItem , 0 , 100 ) ,
tagTem . TagProductList = productListRsp
//获取推荐产品列表
if t agInfo . RecommendProduct != nil && * tagInfo . RecommendProduct != "" {
}
//当前tag保存入map
//加入分类
mapTagLevel [ * tagInfo . LevelPrefix ] = & tagTem
}
//组装等级从属关系