thread-master/internal/library/placement/product_catalog.go

87 lines
2.1 KiB
Go

package placement
import (
"strings"
brandentity "haixun-backend/internal/model/brand/domain/entity"
)
func BuildMergedProductContext(brandName, productContext, productLabel string) string {
fields := ParseProductContext(productContext)
if name := strings.TrimSpace(brandName); name != "" {
fields.Brand = name
}
if label := strings.TrimSpace(productLabel); label != "" && fields.Product == "" {
fields.Product = label
}
return SerializeProductContext(fields)
}
func RecommendProduct(products []brandentity.Product, searchTag, defaultProductID string) *brandentity.Product {
if len(products) == 0 {
return nil
}
var defaultProduct *brandentity.Product
if id := strings.TrimSpace(defaultProductID); id != "" {
for i := range products {
if products[i].ID == id {
defaultProduct = &products[i]
break
}
}
}
tag := strings.TrimSpace(searchTag)
if tag == "" {
if defaultProduct != nil {
return defaultProduct
}
return &products[0]
}
bestScore := -1
var best *brandentity.Product
for i := range products {
score := ScoreProductForTag(tag, products[i].MatchTags)
if score > bestScore {
bestScore = score
best = &products[i]
}
}
if best != nil && bestScore > 0 {
return best
}
if defaultProduct != nil {
return defaultProduct
}
return &products[0]
}
func ResolveBrandProductContext(brand brandentity.Brand, productID, searchTag string) string {
if len(brand.Products) > 0 {
picked := RecommendProduct(brand.Products, searchTag, productID)
if picked != nil {
return BuildMergedProductContext(brand.DisplayName, picked.ProductContext, picked.Label)
}
}
if formatted := ProductBriefFromContext(brand.ProductContext); formatted != "" {
return formatted
}
if brief := strings.TrimSpace(brand.ProductBrief); brief != "" {
return brief
}
return ""
}
func FindProduct(brand brandentity.Brand, productID string) *brandentity.Product {
id := strings.TrimSpace(productID)
if id == "" {
return nil
}
for i := range brand.Products {
if brand.Products[i].ID == id {
return &brand.Products[i]
}
}
return nil
}