From bd127a7884336eb45e2ae4d45d990d82436c240a Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Wed, 19 Jul 2023 14:58:05 +0800 Subject: [PATCH] fix --- go.mod | 2 +- .../internal/logic/gettagproductlistlogic.go | 111 +++++++++++++++++- server/product/internal/types/types.go | 20 ++-- server_api/product.api | 20 ++-- 4 files changed, 129 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 862c6ebd..fd58d3af 100644 --- a/go.mod +++ b/go.mod @@ -74,7 +74,7 @@ require ( go.opentelemetry.io/otel/trace v1.14.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/automaxprocs v1.5.2 // indirect - golang.org/x/net v0.12.0 // indirect + golang.org/x/net v0.12.0 golang.org/x/sys v0.10.0 // indirect golang.org/x/text v0.11.0 google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect diff --git a/server/product/internal/logic/gettagproductlistlogic.go b/server/product/internal/logic/gettagproductlistlogic.go index 3cb7ba9f..22ad4b2d 100644 --- a/server/product/internal/logic/gettagproductlistlogic.go +++ b/server/product/internal/logic/gettagproductlistlogic.go @@ -177,6 +177,7 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR mapProductSizeCount[v.ProductId] = v.Num } } + //map tag菜单 mapTagLevel := make(map[string]*types.TagItem) minLevel := int64(0) //记录最小等级数字 for _, tagInfo := range tagList { @@ -214,10 +215,35 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR Size: req.Size, User: user, }) + //赋值 tagTem.TagProductList = productListRsp //获取推荐产品列表 if tagInfo.RecommendProduct != nil && *tagInfo.RecommendProduct != "" { - + //上面解析过,这里就无需判断错误 + recommendProductIds, _ := format.StrSlicToInt64Slice(strings.Split(*tagInfo.RecommendProduct, ",")) + //推荐产品的排序 + recommendProductIdsSort, err := format.StrSlicToInt64Slice(strings.Split(*tagInfo.RecommendProductSort, ",")) + if err != nil{ + logx.Error(err) + return nil + } + if len(recommendProductIds) != len(recommendProductIdsSort){ + return resp.SetStatusWithMessage(basic.CodeServiceErr,fmt.Sprintf("length of recommend product id is neq length of recommend sort,id= %d",tagInfo.Id)) + } + recommendProductListRsp := l.getTagRecommendProducts(getTagRecommendProductsReq{ + TagInfo: tagInfo, + ProductList: productList, + MapProduct: mapProduct, + MapProductMinPrice: mapProductMinPrice, + MapProductTemplate: mapProductTemplate, + MapProductSizeCount: mapProductSizeCount, + RecommendProductIds: recommendProductIds, + RecommendProductIdsSort: recommendProductIdsSort, + Size: req.Size, + User: user, + }) + //赋值 + tagTem.TagRecommendProductList = recommendProductListRsp } //加入分类 mapTagLevel[*tagInfo.LevelPrefix] = &tagTem @@ -235,7 +261,7 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR if parent, ok := mapTagLevel[parentPrefix]; ok { parent.ChildTagList = append(parent.ChildTagList, tagItem) //排序 - sort.Slice(parent.ChildTagList, func(i, j int) bool { + sort.SliceStable(parent.ChildTagList, func(i, j int) bool { return parent.ChildTagList[i].Sort < parent.ChildTagList[j].Sort }) mapTagLevel[parentPrefix] = parent @@ -250,7 +276,7 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR tagListRsp = append(tagListRsp, *v) } //排序 - sort.Slice(tagListRsp, func(i, j int) bool { + sort.SliceStable(tagListRsp, func(i, j int) bool { return tagListRsp[i].Sort < tagListRsp[j].Sort }) return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetTagProductListRsp{ @@ -258,7 +284,86 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR TagList: tagListRsp, }) } +//排序推荐产品结构体 +type sortRecommendProduct struct { + ProductId int64 + Sort int64 +} +//获取tag推荐产品列表 +type getTagRecommendProductsReq struct { + TagInfo gmodel.FsTags + ProductList []gmodel.FsProduct + MapProduct map[int64]int + MapProductMinPrice map[int64]int64 + MapProductTemplate map[int64]struct{} + MapProductSizeCount map[int64]int64 + RecommendProductIds []int64 + RecommendProductIdsSort []int64 + Size uint32 + User gmodel.FsUser +} +func (l *GetTagProductListLogic)getTagRecommendProducts(req getTagRecommendProductsReq)(productListRsp []types.TagProduct){ + //排序 + sortList := make([]sortRecommendProduct,0,len(req.RecommendProductIds)) + for sortIndex,pid := range req.RecommendProductIds{ + sortList = append(sortList,sortRecommendProduct{ + ProductId: pid, + Sort: req.RecommendProductIdsSort[sortIndex], + }) + } + sort.SliceStable(sortList, func(i, j int) bool { + return sortList[i].Sort < sortList[j].Sort + }) + productListRsp = make([]types.TagProduct,0,len(sortList)) + for _,sortVal := range sortList{ + productIndex,ok := req.MapProduct[sortVal.ProductId] + if !ok{ + continue + } + productInfo := req.ProductList[productIndex] + minPrice, ok := req.MapProductMinPrice[productInfo.Id] + _, tmpOk := req.MapProductTemplate[productInfo.Id] + //无最小价格则不显示 || 没有模板也不显示 + if !ok || !tmpOk { + continue + } + sizeNum := int64(0) + if mapSizeNum, ok := req.MapProductSizeCount[productInfo.Id]; ok { + sizeNum = mapSizeNum + } + item := types.TagProduct{ + ProductId: productInfo.Id, + Sn: *productInfo.Sn, + Title: *productInfo.Title, + Intro: *productInfo.Intro, + IsEnv: *productInfo.IsProtection, + IsMicro: *productInfo.IsMicrowave, + SizeNum: uint32(sizeNum), + MiniPrice: minPrice, + } + //千人千面处理 + r := image.ThousandFaceImageFormatReq{ + Size: int(req.Size), + IsThousandFace: 0, + Cover: *productInfo.Cover, + CoverImg: *productInfo.CoverImg, + CoverDefault: *productInfo.CoverImg, + ProductId: productInfo.Id, + UserId: req.User.Id, + } + if req.User.Id != 0 { + r.IsThousandFace = int(*req.User.IsThousandFace) + } + image.ThousandFaceImageFormat(&r) + item.Cover = r.Cover + item.CoverImg = r.CoverImg + item.CoverDefault = r.CoverDefault + //加入切片 + productListRsp = append(productListRsp,item) + } + return productListRsp +} // 获取对应tag的产品列表 type getTagProductsReq struct { TagId int64 diff --git a/server/product/internal/types/types.go b/server/product/internal/types/types.go index 096a3626..2e1ede83 100644 --- a/server/product/internal/types/types.go +++ b/server/product/internal/types/types.go @@ -256,16 +256,16 @@ type GetTagProductListRsp struct { } type TagItem struct { - TypeName string `json:"type_name"` - TypeId int64 `json:"type_id"` - Description string `json:"description"` - Level int64 `json:"level"` - LevelPrefix string `json:"level_prefix"` - Icon string `json:"icon"` - Sort int64 `json:"sort"` - TagProductList []TagProduct `json:"tag_product_list"` //分类下的产品 - TagRecommendProductList [][]TagProduct `json:"tag_recommend_product_list"` //分类推荐产品 - ChildTagList []*TagItem `json:"child_tag_list"` + TypeName string `json:"type_name"` + TypeId int64 `json:"type_id"` + Description string `json:"description"` + Level int64 `json:"level"` + LevelPrefix string `json:"level_prefix"` + Icon string `json:"icon"` + Sort int64 `json:"sort"` + TagProductList []TagProduct `json:"tag_product_list"` //分类下的产品 + TagRecommendProductList []TagProduct `json:"tag_recommend_product_list"` //分类推荐产品 + ChildTagList []*TagItem `json:"child_tag_list"` } type TagProduct struct { diff --git a/server_api/product.api b/server_api/product.api index 12037107..7dad4ba3 100644 --- a/server_api/product.api +++ b/server_api/product.api @@ -300,16 +300,16 @@ type GetTagProductListRsp { TagList []TagItem `json:"tag_list"` } type TagItem { - TypeName string `json:"type_name"` - TypeId int64 `json:"type_id"` - Description string `json:"description"` - Level int64 `json:"level"` - LevelPrefix string `json:"level_prefix"` - Icon string `json:"icon"` - Sort int64 `json:"sort"` - TagProductList []TagProduct `json:"tag_product_list"` //分类下的产品 - TagRecommendProductList [][]TagProduct `json:"tag_recommend_product_list"` //分类推荐产品 - ChildTagList []*TagItem `json:"child_tag_list"` + TypeName string `json:"type_name"` + TypeId int64 `json:"type_id"` + Description string `json:"description"` + Level int64 `json:"level"` + LevelPrefix string `json:"level_prefix"` + Icon string `json:"icon"` + Sort int64 `json:"sort"` + TagProductList []TagProduct `json:"tag_product_list"` //分类下的产品 + TagRecommendProductList []TagProduct `json:"tag_recommend_product_list"` //分类推荐产品 + ChildTagList []*TagItem `json:"child_tag_list"` } type TagProduct { ProductId int64 `json:"product_id"`