@@ -1,6 +1,7 @@
package logic
import (
"encoding/json"
"errors"
"fusenapi/model/gmodel"
"fusenapi/utils/auth"
@@ -86,9 +87,11 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
productList [ ] gmodel . FsProduct //产品列表( select 字段需要看查询的地方)
mapTagProp = make ( map [ int64 ] [ ] types . CoverDefaultItem )
mapProductHaveOptionFitting = make ( map [ int64 ] struct { } )
mapProductMinPrice = make ( map [ int64 ] int64 ) //产品最小价格map
mapProductSizeCount = make ( map [ int64 ] int64 ) //产品尺寸数量map
mapProductTemplate = make ( map [ int64 ] int64 ) //产品模板map
mapProductMinPrice = make ( map [ int64 ] int64 ) //产品最小价格map
mapProductSizeCount = make ( map [ int64 ] int64 ) //产品尺寸数量map
mapProductTemplate = make ( map [ int64 ] int64 ) //产品模板map
mapResourceMetadata = make ( map [ string ] map [ string ] interface { } ) //资源元数据
mapProductDefaultSize = make ( map [ int64 ] int64 )
)
//携带产品
if req . WithProduct {
@@ -101,6 +104,8 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
MapProductMinPrice : mapProductMinPrice ,
MapProductSizeCount : mapProductSizeCount ,
MapProductTemplate : mapProductTemplate ,
MapProductDefaultSize : mapProductDefaultSize ,
MapResourceMetadata : mapResourceMetadata ,
} )
if err != nil {
logx . Error ( err )
@@ -121,6 +126,8 @@ func (l *GetTagProductListLogic) GetTagProductList(req *types.GetTagProductListR
MapProductSizeCount : mapProductSizeCount ,
MapTagLevel : mapTagLevel ,
MapProductHaveOptionFitting : mapProductHaveOptionFitting ,
MapResourceMetadata : mapResourceMetadata ,
MapProductDefaultSize : mapProductDefaultSize ,
Size : req . Size ,
User : user ,
MinLevel : & minLevel ,
@@ -146,6 +153,8 @@ type getProductRelationInfoReq struct {
MapProductMinPrice map [ int64 ] int64
MapProductSizeCount map [ int64 ] int64
MapProductTemplate map [ int64 ] int64
MapResourceMetadata map [ string ] map [ string ] interface { }
MapProductDefaultSize map [ int64 ] int64
}
func ( l * GetTagProductListLogic ) getProductRelationInfo ( req getProductRelationInfoReq ) ( productList [ ] gmodel . FsProduct , err error ) {
@@ -153,6 +162,7 @@ func (l *GetTagProductListLogic) getProductRelationInfo(req getProductRelationIn
productTemplatesV2List [ ] gmodel . FsProductTemplateV2
productSizeCountList [ ] gmodel . CountProductSizeByStatusRsp
productOptionalPartList [ ] gmodel . GetGroupPartListByProductIdsRsp
resourceIds = make ( [ ] string , 0 , 200 ) //涉及资源的id集合
)
//查询符合的产品列表
pIsDel := int64 ( 0 )
@@ -174,6 +184,16 @@ func (l *GetTagProductListLogic) getProductRelationInfo(req getProductRelationIn
productIds := make ( [ ] int64 , 0 , len ( productList ) )
for _ , product := range productList {
productIds = append ( productIds , product . Id )
coverSlice := strings . Split ( * product . Cover , "/" )
coverImgSlice := strings . Split ( * product . CoverImg , "/" )
lenCoverSlice := len ( coverSlice )
lenCoverImgSlice := len ( coverImgSlice )
if lenCoverSlice > 1 {
resourceIds = append ( resourceIds , coverSlice [ lenCoverSlice - 1 ] )
}
if lenCoverImgSlice > 1 {
resourceIds = append ( resourceIds , coverImgSlice [ lenCoverImgSlice - 1 ] )
}
}
//获取商品可选配件
productOptionalPartList , err = l . svcCtx . AllModels . FsProductModel3d . GetGroupPartListByProductIds ( l . ctx , productIds )
@@ -196,10 +216,31 @@ func (l *GetTagProductListLogic) getProductRelationInfo(req getProductRelationIn
logx . Error ( err )
return nil , errors . New ( "failed to get product tag property" )
}
for _ , v := range productTagPropList {
coverSlice := strings . Split ( * v . Cover , "/" )
lenCoverSlice := len ( coverSlice )
if lenCoverSlice > 1 {
resourceIds = append ( resourceIds , coverSlice [ lenCoverSlice - 1 ] )
}
}
//根据resourceUrls找到对应的元数据
resourceMetadataList , err := l . svcCtx . AllModels . FsResource . FindAllByResourceIds ( l . ctx , resourceIds )
if err != nil {
logx . Error ( err )
return nil , errors . New ( "failed to get resource list" )
}
for _ , v := range resourceMetadataList {
var metadata map [ string ] interface { }
if v . Metadata != nil {
_ = json . Unmarshal ( [ ] byte ( * v . Metadata ) , & metadata )
}
req . MapResourceMetadata [ * v . ResourceUrl ] = metadata
}
for _ , v := range productTagPropList {
req . MapTagProp [ * v . ProductId ] = append ( req . MapTagProp [ * v . ProductId ] , types . CoverDefaultItem {
Tag : v . TemplateTag ,
Cover : * v . Cover ,
Tag : v . TemplateTag ,
Cover : * v . Cover ,
CoverMetadata : req . MapResourceMetadata [ * v . Cover ] ,
} )
}
//获取产品价格列表
@@ -229,22 +270,40 @@ func (l *GetTagProductListLogic) getProductRelationInfo(req getProductRelationIn
req . MapProductMinPrice [ v . ProductId ] = int64 ( priceSlice [ 0 ] )
}
}
//获取模板(只是获取产品product_id,id)
if req . TemplateTag != "" { //指定模板tag
productTemplatesV2List , err = l . svcCtx . AllModels . FsProductTemplateV2 . FindAllByProductIdsTemplateTag ( l . ctx , productIds , req . TemplateTag , "sort ASC" , "product_id,id" )
} else { //没指定模板tag
productTemplatesV2List , err = l . svcCtx . AllModels . FsProductTemplateV2 . FindAllByProductIds ( l . ctx , productIds , "sort ASC" , "product_id,id" )
}
//获取模板
productTemplatesV2List , err = l . svcCtx . AllModels . FsProductTemplateV2 . FindAllByProductIds ( l . ctx , productIds , "sort ASC" , "product_id,id,model_id,template_tag" )
if err != nil {
logx . Error ( err )
return nil , errors . New ( "failed to get product templates" )
}
//只存第一个
mapModelId := make ( map [ int64 ] struct { } )
for _ , v := range productTemplatesV2List {
if _ , ok := req . MapProductTemplate [ * v . ProductId ] ; ok {
//标签符合不为空且遍历等于传入的模板标签
if * v . TemplateTag == req . TemplateTag {
req . MapProductTemplate [ * v . ProductId ] = v . Id
mapModelId [ * v . ModelId ] = struct { } { }
continue
}
req . MapProductTemplate [ * v . ProductId ] = v . Id
//如果已经有了则不用管
if _ , ok := req . MapProductTemplate [ * v . ProductId ] ; ok {
continue
} else { //否则设置一个值
req . MapProductTemplate [ * v . ProductId ] = v . Id
mapModelId [ * v . ModelId ] = struct { } { }
}
}
modelIds := make ( [ ] int64 , 0 , len ( mapModelId ) )
for modelId , _ := range mapModelId {
modelIds = append ( modelIds , modelId )
}
//根据modelIds查询尺寸
defaultSizeList , err := l . svcCtx . AllModels . FsProductSize . GetAllByModelIdsJoinModeld ( l . ctx , modelIds )
if err != nil {
logx . Error ( err )
return nil , errors . New ( "get product default model3d list err" )
}
for _ , v := range defaultSizeList {
req . MapProductDefaultSize [ * v . ProductId ] = v . Id
}
//获取产品尺寸数量
productSizeCountList , err = l . svcCtx . AllModels . FsProductSize . GetGroupProductSizeByStatus ( l . ctx , productIds , 1 )
@@ -270,6 +329,8 @@ type dealWithTagMenuDataReq struct {
MapProductSizeCount map [ int64 ] int64
MapTagLevel map [ string ] * types . TagItem
MapProductHaveOptionFitting map [ int64 ] struct { }
MapResourceMetadata map [ string ] map [ string ] interface { }
MapProductDefaultSize map [ int64 ] int64
Size uint32
User gmodel . FsUser
MinLevel * int //层级最小的
@@ -302,6 +363,8 @@ func (l *GetTagProductListLogic) dealWithTagMenuData(req dealWithTagMenuDataReq)
MapProductTemplate : req . MapProductTemplate ,
MapProductSizeCount : req . MapProductSizeCount ,
MapProductHaveOptionFitting : req . MapProductHaveOptionFitting ,
MapResourceMetadata : req . MapResourceMetadata ,
MapProductDefaultSize : req . MapProductDefaultSize ,
Size : req . Size ,
User : req . User ,
} )
@@ -378,6 +441,8 @@ type getTagProductsReq struct {
MapProductTemplate map [ int64 ] int64
MapProductSizeCount map [ int64 ] int64
MapProductHaveOptionFitting map [ int64 ] struct { }
MapResourceMetadata map [ string ] map [ string ] interface { }
MapProductDefaultSize map [ int64 ] int64
Size uint32
User gmodel . FsUser
}
@@ -406,6 +471,11 @@ func (l *GetTagProductListLogic) getTagProducts(req getTagProductsReq) (productL
if _ , ok = req . MapProductHaveOptionFitting [ productInfo . Id ] ; ok {
haveOptionalFitting = true
}
//默认尺寸id
defaultSizeId := int64 ( 0 )
if sizeId , ok := req . MapProductDefaultSize [ productInfo . Id ] ; ok {
defaultSizeId = sizeId
}
item := types . TagProduct {
ProductId : productInfo . Id ,
Sn : * productInfo . Sn ,
@@ -413,10 +483,12 @@ func (l *GetTagProductListLogic) getTagProducts(req getTagProductsReq) (productL
SizeNum : uint32 ( sizeNum ) ,
CoverDefault : [ ] types . CoverDefaultItem { } ,
DefaultTemplateId : templateId ,
DefaultSizeId : defaultSizeId ,
MinPrice : minPrice ,
HaveOptionalFitting : haveOptionalFitting ,
Recommended : * productInfo . IsRecommend > 0 ,
Cover : * productInfo . Cover ,
CoverMetadata : req . MapResourceMetadata [ * productInfo . Cover ] ,
}
if _ , ok = req . MapTagProp [ productInfo . Id ] ; ok {
item . CoverDefault = req . MapTagProp [ productInfo . Id ]